1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-05 23:53:33 +00:00

Compare commits

...

2368 Commits

Author SHA1 Message Date
Kyle Spearrin
cfe84963fa switch to access token, bump version 2020-07-06 13:54:44 -04:00
Kyle Spearrin
d908a599b1 bump version and build fixes 2020-07-06 13:28:19 -04:00
Kyle Spearrin
9b3ddb8da3 bump version via hub release command 2020-07-06 11:56:00 -04:00
Kyle Spearrin
56d994a69d bump version 2020-07-06 11:27:19 -04:00
Kyle Spearrin
67cd17c604 do actions on master push or release event 2020-07-06 11:26:51 -04:00
Kyle Spearrin
f4fb7eb8b7 New Crowdin updates (#1003)
* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Slovak)
2020-07-06 10:39:38 -04:00
Kyle Spearrin
b9021e4331 bump version 2020-07-06 10:36:23 -04:00
Kyle Spearrin
3583836d3e Upload release assets for ios too 2020-07-06 09:55:16 -04:00
Kyle Spearrin
278815119f update workflow for release tasks 2020-07-06 09:50:26 -04:00
Contribucious
1bb678e455 [KnownUsernameField] Compatibility with more browsers (#1000) 2020-07-01 10:31:12 -04:00
Kyle Spearrin
b9e5fc604b New Crowdin updates (#999)
* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)
2020-06-29 11:30:02 -04:00
Kyle Spearrin
b65e8c48ce New Crowdin updates (#996)
* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Sinhala)

* New translations copy.resx (Sinhala)

* New translations copy.resx (Sinhala)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Belarusian)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Norwegian Bokmal)
2020-06-26 21:28:06 -04:00
Chad Scharf
e59bc1a08e version bump (#994)
* version bump

* version bump + fix manifest XML formatting
2020-06-25 17:30:14 -04:00
Kyle Spearrin
ff994629de Do not process hostname for regex logins (#987) 2020-06-18 11:58:19 -04:00
Matt Portune
a458b9bc88 Workaround for disabling predictive text in visible password fields (#983)
* Workaround for disabling predictive text in visible password fields

* Fix for non-master branch iOS builds (#984)

* Enable extra workflow steps to allow iOS builds to succeed from non-master branch

* re-enable provisioning profile setup
2020-06-16 11:09:26 -04:00
Matt Portune
2834e25151 Fix for non-master branch iOS builds (#984)
* Enable extra workflow steps to allow iOS builds to succeed from non-master branch

* re-enable provisioning profile setup
2020-06-16 09:55:08 -04:00
Oscar Hinton
c2582fe055 Resolve new ciphers defaulting to ViewPassword = false, causing passwords to be non editable. (#982) 2020-06-15 12:33:36 -04:00
Matt Portune
0980219c8d Add autofill/a11y support for ungoogled.chromium browser (#978) 2020-06-12 15:01:23 -04:00
Oscar Hinton
c5f158f1cf Resolve all passwords being hidden after upgrade (#977) 2020-06-12 09:50:36 -04:00
Kyle Spearrin
62afc023c8 print github ref 2020-06-11 16:26:10 -04:00
Oscar Hinton
52ca84946b Add support for hidden passwords (#920)
* Add support for hidden passwords

* Hide TOTP, hide hidden fields.

* Change _cipher to Cipher.
2020-06-11 16:16:43 -04:00
Kyle Spearrin
e64fb39c32 bump version 2020-06-10 13:49:58 -04:00
Kyle Spearrin
1066598150 fix ipa path 2020-06-10 13:30:08 -04:00
Kyle Spearrin
caed8c2cf0 explore paths 2020-06-10 13:13:03 -04:00
Kyle Spearrin
663be2402d list file system 2020-06-10 12:43:52 -04:00
Kyle Spearrin
6fd24c842f get proper ipa for app store 2020-06-10 12:24:52 -04:00
Kyle Spearrin
302631c4fa set CFBundlePackageType 2020-06-10 11:54:21 -04:00
Kyle Spearrin
8a94623b2b type ios 2020-06-10 11:48:02 -04:00
Kyle Spearrin
016dfdb455 dont archive for app store if not master 2020-06-10 11:33:43 -04:00
Kyle Spearrin
097415385e deploy to app store 2020-06-10 11:32:16 -04:00
Kyle Spearrin
8e6c6e04a3 cleanup export, ipa artifact 2020-06-10 10:53:57 -04:00
Kyle Spearrin
81a30e580e export ipa for app store 2020-06-10 10:02:15 -04:00
Kyle Spearrin
676efe7253 ls archive folder 2020-06-10 09:24:27 -04:00
Kyle Spearrin
39e0e77824 archive on build 2020-06-10 09:03:12 -04:00
Kyle Spearrin
363f5be8ff increment version for ios 2020-06-09 21:23:10 -04:00
Kyle Spearrin
df15fa2f0e move stuff to setup keychain script 2020-06-09 20:47:46 -04:00
Kyle Spearrin
e8c1fbb86f allow codesign to access certs and key 2020-06-09 20:36:44 -04:00
Kyle Spearrin
df986b9ecf timeout settings are for build.keychain 2020-06-09 20:32:23 -04:00
Kyle Spearrin
daabf4bab9 build again 2020-06-09 20:16:03 -04:00
Kyle Spearrin
3095948024 set keychain timeout 2020-06-09 20:14:40 -04:00
Kyle Spearrin
fad289305f add codesign to set-key-partition-list 2020-06-09 17:43:40 -04:00
Kyle Spearrin
97d8f07e0d Merge branch 'master' of github.com:bitwarden/mobile 2020-06-09 17:33:03 -04:00
Kyle Spearrin
dc374c7ce9 try unlocking keychain 2020-06-09 17:32:53 -04:00
Matt Portune
1584475bc3 added hi-res icon for google play (#966)
* added hi-res icon for google play

* moved to proper location
2020-06-09 17:24:19 -04:00
Kyle Spearrin
8f1db25c5c move cloc to its own job 2020-06-09 13:18:22 -04:00
Kyle Spearrin
092b536009 remove debug 2020-06-09 13:14:11 -04:00
Kyle Spearrin
f95bbaa0f7 resolve path of ~ 2020-06-09 13:09:00 -04:00
Kyle Spearrin
bc1f6464d3 change home path to ~ 2020-06-09 13:00:43 -04:00
Kyle Spearrin
b828cd5975 write out homePath 2020-06-09 12:56:53 -04:00
Kyle Spearrin
766b4f7971 create profiles dir path if it doesnt exist 2020-06-09 12:35:39 -04:00
Kyle Spearrin
45e2ffd71e properly escape space 2020-06-09 12:31:18 -04:00
Kyle Spearrin
98757c3f11 use proper params for copy-item 2020-06-09 12:27:40 -04:00
Kyle Spearrin
9aed6d350b setup provisioning profiles 2020-06-09 12:25:09 -04:00
Kyle Spearrin
ca6ce6db32 add mobile profiles 2020-06-09 12:15:06 -04:00
Kyle Spearrin
1c9a6a02af change all seps to / so that it works x-platform 2020-06-09 11:52:23 -04:00
Kyle Spearrin
ba9bafcb5f fix sep character 2020-06-09 11:48:11 -04:00
Kyle Spearrin
0628394122 update path sep character 2020-06-09 11:46:16 -04:00
Kyle Spearrin
99b2cd2ad0 fix pathing 2020-06-09 11:41:03 -04:00
Kyle Spearrin
707a6ecbaa setup ios keychain 2020-06-09 11:37:40 -04:00
Kyle Spearrin
aa2bc40f03 decrypt ios secrets 2020-06-09 11:19:02 -04:00
Kyle Spearrin
5e00e76c4b ios secrets 2020-06-09 11:16:13 -04:00
Kyle Spearrin
0dba992dd4 fix build for app store script path 2020-06-09 10:51:35 -04:00
Kyle Spearrin
b6f61cac9b build play store publisher 2020-06-09 10:47:20 -04:00
Kyle Spearrin
0e41945a8a build ios 2020-06-09 10:47:09 -04:00
Kyle Spearrin
a05e037308 deploy to play store 2020-06-09 10:21:46 -04:00
Kyle Spearrin
f40576c39d print lines of code from CLOC 2020-06-09 10:17:26 -04:00
Kyle Spearrin
9fc810182a print dotnet info 2020-06-09 09:58:28 -04:00
Kyle Spearrin
dd7a52ba08 print version code 2020-06-08 16:10:17 -04:00
Kyle Spearrin
fa6d2a3080 break steps out a bit more 2020-06-08 16:04:04 -04:00
Laurent Tréguier
36efc0c877 Tweak icons to better blend with Android and iOS (#962)
* Add shadow to Android icon

* Add gradient to iOS icon
2020-06-08 15:02:20 -04:00
Kyle Spearrin
e9efcf1b92 rework build scripts 2020-06-08 13:19:44 -04:00
Kyle Spearrin
f4ad1ec8e7 fix secretOutputPath 2020-06-08 13:02:38 -04:00
Kyle Spearrin
0027c21630 more pathing fixes 2020-06-08 13:00:52 -04:00
Kyle Spearrin
6173cab99f fix decryptSecretPath 2020-06-08 12:56:58 -04:00
Kyle Spearrin
80c8097a71 fix paths to ps scripts 2020-06-08 12:55:02 -04:00
Kyle Spearrin
ba3d577125 try shell: pwsh 2020-06-08 12:29:57 -04:00
Kyle Spearrin
8ce4ebb16e powershell Invoke-Expression 2020-06-08 12:25:39 -04:00
Kyle Spearrin
4358ff2338 run powershell commands 2020-06-08 12:21:43 -04:00
Kyle Spearrin
53f9eb083d branches ignore and only on master 2020-06-08 12:17:53 -04:00
Kyle Spearrin
0a3a982cb9 github action android build steps 2020-06-08 12:14:22 -04:00
Kyle Spearrin
c30239b3a8 encrypted GPG files for github actions 2020-06-08 12:14:22 -04:00
Matt Portune
183834689d Fix for accessibility overlay on Android 5 & 6 (#965)
* Fix for accessibility overlay on Android 5 & 6

* changed to skip check outright until API 26
2020-06-08 08:25:24 -04:00
Matt Portune
5da2f3279b biometrics cleanup (#964) 2020-06-08 08:25:13 -04:00
Kyle Spearrin
ec7d87e757 bump version 2020-06-07 11:56:16 -04:00
Kyle Spearrin
4155f69e3c formatting fixes 2020-06-07 11:54:14 -04:00
Matt Portune
473e93ea16 Fix for deadlock in iOS autofill & share extensions (#960) 2020-06-07 00:15:51 -04:00
Kyle Spearrin
fd1941cc3e target iPhone 2020-06-05 15:31:30 -04:00
Kyle Spearrin
dbb51b58db update platforms for ios core builds 2020-06-05 15:30:24 -04:00
Kyle Spearrin
e7d00cfe54 set iphone and sim platforms for ios core 2020-06-05 15:23:15 -04:00
Kyle Spearrin
63453fa962 fix syntax 2020-06-05 14:40:44 -04:00
Kyle Spearrin
689eb7f87b CI updates 2020-06-05 14:39:29 -04:00
Kyle Spearrin
67a4646a50 try out github actions 2020-06-05 13:51:57 -04:00
Kyle Spearrin
a4e0535464 null check all the things (#957) 2020-06-05 13:30:53 -04:00
Kyle Spearrin
61495cd428 bumping ios version to match what was released 2020-06-04 09:48:10 -04:00
Carl
9e7b7415a5 Add support for Bromite's vanilla build of Chromium (#951) 2020-06-02 23:18:30 -04:00
Kyle Spearrin
06a462d48c skip litedb from ios linker 2020-06-02 14:06:53 -04:00
Kyle Spearrin
d3e6e415b9 bump version 2020-06-02 13:08:04 -04:00
Kyle Spearrin
7e633d31a0 sign fdroid builds with a different keystore (#949) 2020-06-02 10:36:16 -04:00
Kyle Spearrin
0fcf006484 Send vaultTimeoutActionChanged event after save (#948) 2020-06-02 09:50:08 -04:00
Kyle Spearrin
48e5b1686f bump version 2020-06-02 09:21:58 -04:00
Kyle Spearrin
608d879c80 New Crowdin translations (#947)
* New translations AppResources.resx (French)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Greek)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Hindi)
2020-06-02 09:20:55 -04:00
Kyle Spearrin
66055f1d7c Singleton LiteDatabase (#946)
* update litedb. initialize db as a static singleton instance.

* dont need to dispose anymore
2020-06-02 09:13:57 -04:00
Kyle Spearrin
1120bff34d Don't build the keyboard index for autofill if using logout action (#943)
* Don't build the keyboard index for autofill if using logout action

* trigger index rebuild on vault timeout changed event
2020-06-01 14:46:53 -04:00
Kyle Spearrin
24547e67bf check for empty string on malformed URL (#944)
* treat empty string host as null

* use `string.IsNullOrEmpty`
2020-06-01 14:46:37 -04:00
Kyle Spearrin
f8c7285f56 update ios language metadata. 2020-06-01 09:45:15 -04:00
Kyle Spearrin
82eb6a4568 New Crowdin translations (#942)
* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Dutch)
2020-06-01 09:32:26 -04:00
Kyle Spearrin
a3f1f7c78d New Crowdin translations (#941)
* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Belarusian)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Greek)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Norwegian Bokmal)
2020-06-01 08:53:20 -04:00
Kyle Spearrin
c377c4a52b bump version 2020-05-30 10:49:51 -04:00
Kyle Spearrin
e5a74cf43c downgrade litedb 2020-05-29 15:26:00 -04:00
Kyle Spearrin
ccf2bf84da allow ios projects to deploy 2020-05-29 15:25:18 -04:00
Kyle Spearrin
fbf3d97d57 check app options ios extension on nfc check (#933) 2020-05-29 15:25:06 -04:00
Chad Scharf
6da0f82ddd Avoid Task.Result usage (#930) 2020-05-29 12:38:26 -04:00
Vincent Salucci
4c3df2e1e1 [Auto Logout] Final review of feature (#932)
* Initial commit of LockService name refactor (#831)

* [Auto-Logout] Update Service layer logic (#835)

* Initial commit of service logic update

* Added default value for action

* Updated ToggleTokensAsync conditional

* Removed unused variables, updated action conditional

* Initial commit: lockOption/lock refactor app layer (#840)

* [Auto-Logout] Settings Refactor - Application Layer Part 2 (#844)

* Initial commit of app layer part 2

* Updated biometrics position

* Reverted resource name refactor

* LockOptions refactor revert

* Updated method casing :: Removed VaultTimeout prefix for timeouts

* Fixed dupe string resource (#854)

* Updated dependency to use VaultTimeoutService (#896)

* [Auto Logout] Xamarin Forms in AutoFill flow (iOS) (#902)

* fix typo in PINRequireMasterPasswordRestart (#900)

* initial commit for xf usage in autofill

* Fixed databinding for hint button

* Updated Two Factor page launch - removed unused imports

* First pass at broadcast/messenger implentation for autofill

* setting theme in extension using theme manager

* extension app resources

* App resources from main app

* fix ref to twoFactorPage

* apply resources to page

* load empty app for sytling in extension

* move ios renderers to ios core

* static ref to resources and GetResourceColor helper

* fix method ref

* move application.current.resources refs to helper

* switch login page alerts to device action dialogs

* run on main thread

* showDialog with device action service

* abstract action sheet to device action service

* add support for yubikey

* add yubikey iimages to extension

* support close button action

* add support to action extension

* remove empty lines

Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com>
Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com>

* [Auto Logout] Update lock option to be default value (#929)

* Initial commit - make lock action default

* Removed extra whitespace

Co-authored-by: Jonas Kittner <54631600+theendlessriver13@users.noreply.github.com>
Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com>
Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
2020-05-29 12:26:36 -04:00
Kyle Spearrin
39e10ff01c New Crowdin translations (#931)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Chinese Simplified)
2020-05-29 12:14:35 -04:00
Kyle Spearrin
0b29c6e5a4 Dispost of LiteDatabase instance (#928) 2020-05-28 15:44:27 -04:00
Contribucious
cd3585be58 Early support for future versions of Firefox (+ some forks) (#923)
* Early support for future versions of Firefox

Note: Ideally, a swapping of the two entries of this resource-id value will be done when the time comes; `url_bar_title` becoming Legacy.

* Early support for future versions of some Firefox forks

Note: Ideally, a swapping of the two entries of these resource-id values will be done when the time comes; `url_bar_title` becoming Legacy.
2020-05-26 10:41:27 -04:00
Kyle Spearrin
4e1f91f4d5 New Crowdin translations (#925)
* New translations AppResources.resx (French)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Belarusian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Catalan)

* New translations copy.resx (Belarusian)

* New translations copy.resx (Belarusian)

* New translations AppResources.resx (Norwegian Bokmal)
2020-05-26 10:35:44 -04:00
Kyle Spearrin
272c2e5303 New Crowdin translations (#921)
* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Belarusian)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Greek)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Norwegian Bokmal)
2020-05-23 09:42:00 -04:00
Contribucious
2a82b09f7b Fix support for Firefox Beta (#918) 2020-05-23 09:38:24 -04:00
Contribucious
fd26492577 Partial revert of "Fix support for Firefox Nightly for Developers" (#919)
My mistake: `org.mozilla.fennec_fdroid` is not an "F-Droid version of Firefox Nightly for Developers". This corrects my error.
2020-05-23 09:38:01 -04:00
Contribucious
528b90b694 Fix support for Firefox Nightly for Developers (#917) 2020-05-23 00:20:51 -04:00
Contribucious
9c7961ff6b Adblock Browser: clarification (#916) 2020-05-22 23:00:27 -04:00
Contribucious
954ed6457c Add support for Privacy Browser (Free/Standard). Closes #407 (#915)
* Add Privacy Browser (Free/Standard) to SupportedBrowsers dict

* Add Privacy Browser (Free/Standard) to CompatBrowsers

* Add Privacy Browser (Free/Standard) compatibility-package entries
2020-05-22 21:06:11 -04:00
Matt Portune
5a8fc2dabc Workaround for pasting into editor within scrollview (#913) 2020-05-20 17:23:59 -04:00
Chad Scharf
ce965ba5e1 Soft delete feature (#890)
* [Soft Delete] Added trash folder to mobile (#856)

* [Soft Delete] Added trash folder to mobile

* [Soft Delete] - Revert send to trash label

Co-authored-by: Chad Scharf <cscharf@users.noreply.github.com>

* [Soft Delete] - Fix for iOS autofill index behavior (#859)

* [Soft Delete] Added trash folder to mobile

* [Soft Delete] - Revert send to trash label

* [Soft Delete] - iOS autofill index behavior fix

Co-authored-by: Chad Scharf <cscharf@users.noreply.github.com>

Co-authored-by: Chad Scharf <cscharf@users.noreply.github.com>
2020-05-20 13:35:20 -04:00
Matt Portune
4b9a036e5e Removal of lifecycle hack for 2FA resume flow (#912) 2020-05-20 09:57:48 -04:00
Matt Portune
4576f378cc lock screen drawing & 2FA entry bugfixes (#910)
* lock screen drawing & 2FA entry bugfixes

* cleanup whitespace
2020-05-20 09:09:28 -04:00
Kyle Spearrin
4c65daa995 New Crowdin translations (#908)
* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Hebrew)

* New translations copy.resx (Hebrew)

* New translations AppResources.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Korean)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Finnish)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Greek)

* New translations AppResources.resx (Bulgarian)

* New translations copy.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Afrikaans)

* New translations copy.resx (Afrikaans)

* New translations copy.resx (Afrikaans)

* New translations AppResources.resx (Belarusian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Bulgarian)

* New translations AppResources.resx (Catalan)

* New translations copy.resx (Catalan)

* New translations copy.resx (Catalan)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (German)

* New translations copy.resx (Bulgarian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Persian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Thai)

* New translations copy.resx (Estonian)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (English, United Kingdom)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Ukrainian)

* New translations copy.resx (Vietnamese)

* New translations copy.resx (Turkish)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Turkish)

* New translations AppResources.resx (Ukrainian)

* New translations copy.resx (Vietnamese)

* New translations copy.resx (Ukrainian)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Vietnamese)

* New translations copy.resx (Norwegian Bokmal)
2020-05-18 15:57:30 -04:00
Jonas Kittner
9159e14dd9 fix typo in PINRequireMasterPasswordRestart (#900) 2020-05-13 13:30:07 -04:00
Matt Portune
da661c229c Lib updates (#889)
* lib updates

* updated libs
2020-05-07 17:03:13 -04:00
Matt Portune
973f09f98a Usability improvements to accessibility settings (#888) 2020-05-07 16:32:42 -04:00
Matt Portune
fef370ad88 Fixed issue with autofill icon image (#887) 2020-05-07 13:54:06 -04:00
Matt Portune
bc46b7172d Updated iOS app icon (#886) 2020-05-07 13:20:07 -04:00
Matt Portune
71f546b467 Updated resources (#884) 2020-05-07 09:03:38 -04:00
Contribucious
a66f66c8ac Add support for AVG Browser (#883)
* Add AVG Browser to SupportedBrowsers dict

* Add AVG Browser to CompatBrowsers

* Add AVG Browser compatibility-package entry
2020-05-06 17:32:53 -04:00
Chad Scharf
c2c6ca22db Fixed spacing on known username field list (#882) 2020-05-06 12:11:58 -04:00
Matt Portune
b29440556a Support for establishing a username field without a password field (#880)
* Support for establishing a username field without a password field

* added aws login
2020-05-06 09:48:34 -04:00
Kyle Spearrin
4104f6f772 Color updates for new branding (#879) 2020-05-05 19:13:18 -04:00
Contribucious
01c56dabdf Add support for LG "Dual Window" mode (Android < 7.0 users) (#878) 2020-05-05 17:38:05 -04:00
Contribucious
fafd8f8ee6 [Browser lists] Global clarification (#876)
* AccessibilityHelpers.cs: global clarification

* AutofillHelpers.cs: global clarification

* autofillservice.xml: global clarification
2020-05-05 10:52:54 -04:00
Contribucious
e2033eee23 Add support for Samsung "Multi Window" mode (Android < 7.0 users) (#877)
... including "Pen Window" support, too.
2020-05-05 10:49:55 -04:00
Contribucious
780761664d Add support for Tor Browser (Alpha) (#872)
* Add Tor Browser (Alpha) to SupportedBrowsers dict

* Add Tor Browser (Alpha) to CompatBrowsers

* Add Tor Browser (Alpha) compatibility-package entry
2020-05-04 09:28:28 -04:00
Contribucious
0cfa737eff Add support for GNU IceCat (#873)
* Add GNU IceCat to SupportedBrowsers dict

* Add GNU IceCat to CompatBrowsers

* Add GNU IceCat compatibility-package entry
2020-05-04 09:27:47 -04:00
Contribucious
6463898c5d Add support for Avast Secure Browser (#874)
* Add Avast Secure Browser to SupportedBrowsers dict

* Add Avast Secure Browser to CompatBrowsers

* Add Avast Secure Browser compatibility-package entry
2020-05-04 09:26:44 -04:00
Contribucious
7d4fffa8b6 Adblock Browser: support for v2+ (stable/beta) + Autofill Framework (#868)
* Adblock Browser (AccessibilityHelpers.SupportedBrowsers): add support for v2+ (stable/beta)

Support for older versions (based on Firefox for Android, instead of Chromium) in the list remains.

* Adblock Browser (AutofillHelpers.CompatBrowsers): add it to the list

* Adblock Browser (autofillservice.xml): add it to the list
2020-05-04 09:25:53 -04:00
Contribucious
bcc415ccb3 Add support for Brave Nightly (also: variants "_dev" and "_default") (#869)
* [Brave] Add all other variants to AccessibilityHelpers.SupportedBrowsers

* [Brave] Add all other variants to AutofillHelpers.CompatBrowsers

* [Brave] Add all other variants to autofillservice.xml
2020-05-04 09:23:09 -04:00
Contribucious
827fead347 AccessibilityHelpers.SupportedBrowsers: add Tor Browser, Firefox Lite and Opera Mini Beta (#866) 2020-05-01 14:00:01 -04:00
Matt Portune
36cdc7dd1c Additional URI parsing fix (#865)
* Additional URI parsing fix

* name cleanup
2020-04-30 16:47:29 -04:00
Contribucious
99dceda8ac [Autofill - Browser lists] Sort the entries alphabetically (#864)
* AccessibilityHelpers.SupportedBrowsers: sort the entries alphabetically

* AutofillHelpers.TrustedBrowsers: sort the entries alphabetically

* AutofillHelpers.CompatBrowsers: sort the entries alphabetically

* autofillservice.xml: sort the entries alphabetically
2020-04-30 11:32:56 -04:00
Matt Portune
9d27f111bf Additional uri parsing intelligence (#861) 2020-04-29 13:09:46 -04:00
Matt Portune
69e0906491 Fixes to uri parsing (#860) 2020-04-29 11:04:50 -04:00
Matt Portune
1d48171fd5 Prevent actionsheet command execution if vault is locked (#857) 2020-04-28 10:25:13 -04:00
Matt Portune
cb0a3e3edf Added additional smarts for establishing permission to draw over other apps (#853) 2020-04-24 14:45:11 -04:00
Chris
2b3915a91f Allow a BiometricPrompt to succeed after an initial failure (#791) (#847)
Previously a call to BiometricPrompt.AuthenticationCallback#OnAuthenticationFailed()
was treated as though an unrecoverable failure had occurred. However this is called on
each failed fingerprint match, for example, and is not a terminal failure. Now these
intermittent failures are ignored and a call to #OnAuthenticationError() is recognised
as an unrecoverable failure instead.
2020-04-23 10:28:43 -04:00
Matt Portune
9a403ba0ed Fixed clipboard not clearing on Android 10 (#851) 2020-04-23 10:01:41 -04:00
Matt Portune
0f35885d1c Set Google publisher upload timeout to 3 minutes (#850) 2020-04-22 13:50:25 -04:00
Matt Portune
e3e07b6bfe Only publish to Google Play if master branch (#848) 2020-04-22 10:54:58 -04:00
Contribucious
84a6d1db71 Add support for Vivaldi Sopranos browser. Closes #673 (#845)
* Add Vivaldi Sopranos to SupportedBrowsers dict

* Add Vivaldi Sopranos to CompatBrowsers

* Add Vivaldi Sopranos compatibility-package entry
2020-04-21 08:49:03 -04:00
Contribucious
8cee50299f Add support for Brave Beta browser (#846)
* Add Brave Beta to SupportedBrowsers dict

* Add Brave Beta to CompatBrowsers

* Add Brave Beta compatibility-package entry
2020-04-21 08:48:29 -04:00
Matt Portune
5a78cbef02 Tracing bundles (#842)
* Output to bundle (play store build only) and enable startup tracing

* Update ci build script to recognize bundle (.aab) for Google Play build

* Added bundle awareness to `appveyor.yml` and `Program.cs`

* Log upload exception

* Restore original apk creation alongside the bundle

* Remove link skip as AOT doesn't support linking
2020-04-17 17:06:37 -04:00
Kyle Spearrin
ae66a781d1 dont use encrypted keystore 2020-04-17 12:55:12 -04:00
Kyle Spearrin
5ae3b66e06 add slash 2020-04-16 17:19:56 -04:00
Kyle Spearrin
c3f1cee5d6 remove salt 2020-04-16 17:12:30 -04:00
Kyle Spearrin
5552c42e37 try secure-file ... again.... 2020-04-16 17:11:25 -04:00
Kyle Spearrin
6f146b888b update secure-file tool 2020-04-16 16:54:32 -04:00
Kyle Spearrin
56c09eae90 add salt to upload key decryption step 2020-04-16 16:43:00 -04:00
Kyle Spearrin
6883864e2d sign with upload keystore 2020-04-16 16:31:52 -04:00
Ash Thompson
15bc395454 Add support for Naver Whale. #600 (#837)
* Add Naver Whale to SupportedBrowsers dict

* Add Naver Whale to CompatBrowsers

* Add Naver Whale compatibility-package
2020-04-16 10:08:16 -04:00
Matt Portune
41997d5fe0 Resync autofill compatibility package list with values from AutofillHelpers (#834) 2020-04-15 13:58:00 -04:00
Jose F. Fernandez
ed259cd130 [FIX] Consider default URI match type on filtering (#830) 2020-04-14 14:56:57 -04:00
Vincent Salucci
1dc027cf49 [Autofill] Apply locked autofill flow to logged out state (#827)
* Initial commit: apply locked auto-fill flow to log out auto-fill

* Alphabetized imports

* Removed unnecessary else conditional

* Fix for talkback slider control (#828)

* Initial commit: apply locked auto-fill flow to log out auto-fill

* Alphabetized imports

* Removed unnecessary else conditional

* Fixed variable init order

Co-authored-by: Matt Portune <59324545+mportune-bw@users.noreply.github.com>
2020-04-13 11:32:23 -05:00
Matt Portune
b2abcda111 Fix for talkback slider control (#828) 2020-04-10 13:30:02 -04:00
Matt Portune
d66eaf8855 Additional accessibility tweaks (#825)
* Additional accessibility tweaks

* Cleanup
2020-04-09 14:57:06 -04:00
Dustin Falgout
78cfd82fdd Remove Unnecessary Toast Message (#808)
Remove unnecessary info message when clicking search during the autofill flow. Fixes #807
2020-04-06 13:19:15 -04:00
Matt Portune
8ad44b405d Add support for Vivaldi snapshot browser (#822)
* Add support for Vivaldi snapshot browser

* Added to autofill helpers CompatBrowsers set as well
2020-04-06 11:43:45 -04:00
Matt Portune
4ce4288f68 Updated dependencies (#820) 2020-04-03 17:17:24 -04:00
Matt Portune
d635555576 Tweaks to autofill tile naming & fixed missing plus icon (#819) 2020-04-03 09:57:04 -04:00
Matt Portune
44999557c0 Tweaks to accessibility autofill overlay (#818) 2020-04-02 19:24:31 -04:00
Matt Portune
5d64bab719 Added handled exception tracking for vault export and bumped CsvHelper to latest (#816)
* Added handled exception tracking for vault export and bumped CsvHelper to latest

* Prevent tracking for FDroid builds

* Remove AppCenter import for FDroid builds
2020-04-02 10:30:21 -04:00
Matt Portune
4d3d8b643a Conversion of HockeyApp to AppCenter for crash reporting (#810)
* Conversion of HockeyApp to AppCenter for crash reporting

* Corrected older-style nuget package definition
2020-04-02 09:02:38 -04:00
Kyle Spearrin
915e8cf072 add litedb to linker skip 2020-03-31 13:23:56 -04:00
Chad Scharf
3c18fd7636 Changed all C# control flow block statements to include space between keyword and open paren (#800) 2020-03-28 09:16:28 -04:00
Matt Portune
6c00ac43fc Added Quick Settings tile for triggering accessibility autofill (#795)
* Added Quick Settings tile for triggering accessibility autofill

* Fix crash when tile attempt to cancel non-visible but non-null overlay

* Persist tile state plus cleanup
2020-03-26 12:15:33 -04:00
Kyle Spearrin
5d9a597d8d switch to stable image 2020-03-26 09:27:24 -04:00
Kyle Spearrin
92930955c3 New Crowdin translations (#794)
* New translations AppResources.resx (Korean)

* New translations copy.resx (Korean)

* New translations copy.resx (Korean)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Greek)

* New translations copy.resx (Greek)

* New translations copy.resx (Greek)
2020-03-24 14:49:44 -04:00
Matt Portune
145482ea30 Project lib updates and migration (#789)
* Replace 3rd party FAB lib with our own code

* merged

* merged

* WIP

* WIP

* WIP

* WIP

* Updated LiteDB

* Update ZXing libs to 2.4.1

* Missing semicolon

* rename fab style to btn-fab

* Revert project guid modified by VSmac
2020-03-20 17:54:23 -04:00
Matt Portune
6fdb1e3356 Add support for inverse data matrix QR codes (#787) 2020-03-19 17:07:15 -04:00
Vincent Salucci
55dff81b9f Sanitize Password Length (#783)
* Sanitize Password Length

* Formatting updates

* Else if format

Co-authored-by: Vincent Salucci <vsalucci@bitwarden.com>
2020-03-18 13:43:20 -05:00
Matt Portune
ed37972b99 Updated .gitignore with latest from Xamarin repo and removed Android Resource.designer.cs file (#781)
* Updated .gitignore with latest from Xamarin repo and removed Android Resource.designer.cs file

* didn't mean to leave vscode settings line in
2020-03-18 11:42:20 -04:00
Kyle Spearrin
c6b37307b0 use string.Empty 2020-03-16 21:07:54 -04:00
Kyle Spearrin
5d719ba235 bump version 2020-03-16 21:05:56 -04:00
Vincent Salucci
c19795cce0 Fix bug with policy banner visibility (#777)
Co-authored-by: Vincent Salucci <vsalucci@bitwarden.com>
2020-03-16 11:17:45 -05:00
Vincent Salucci
df8f44d77d Enforce Passphrase Policy (#772)
* Enforce passphrase policy

* Update multi-line conditional formatting

* Updated formatting round 2

Co-authored-by: Vincent Salucci <vsalucci@bitwarden.com>
2020-03-13 23:02:38 -05:00
Matt Portune
a4eff45534 Testing Google publisher fix (#773) 2020-03-13 21:50:00 -04:00
Kyle Spearrin
b2b12be3b0 update google publisher lib 2020-03-13 11:55:03 -04:00
Matt Portune
9c77c53366 Bumped csvhelper to 15.0.1 and added missing error dialog in export failure flow (#771) 2020-03-13 11:02:49 -04:00
Kyle Spearrin
1449f165dd New Crowdin translations (#770)
* New translations AppResources.resx (Belarusian)

* New translations copy.resx (Hebrew)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations copy.resx (Norwegian Bokmal)

* New translations AppResources.resx (Polish)

* New translations copy.resx (German)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Finnish)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Spanish)
2020-03-12 21:15:15 -04:00
Matt Portune
94216cf745 Null check policies from SyncResponse before parsing (#767)
* Null check policies from SyncResponse before parsing

* Update src/Core/Services/SyncService.cs

formatting

Co-Authored-By: Kyle Spearrin <kspearrin@users.noreply.github.com>

Co-authored-by: Kyle Spearrin <kspearrin@users.noreply.github.com>
2020-03-12 15:45:34 -04:00
Kyle Spearrin
120e179fb8 Move tab bar colors to styles (#764) 2020-03-11 09:46:48 -04:00
kspearrin
f10114ee17 * iOS.Autofill.csproj: Fix profiles used for builds
* iOS.csproj:
* iOS.Extension.csproj:
2020-03-11 09:33:52 -04:00
Matt Portune
8a059e0fbb Fixed issue where multiple threads were attempting to modify search result list (#761)
* Fixed issue where multiple threads were attempting to modify search result list

* Fixed race condition
2020-03-09 18:43:28 -04:00
Kyle Spearrin
6263788d6a New Crowdin translations (#758)
* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Greek)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)
2020-03-06 11:30:58 -05:00
Matt Portune
6ffb3136d4 Workaround for older bug in Xamarin.Forms by waiting for app to resume before attempting to set Application.Current.MainPage (#757) 2020-03-05 16:18:04 -05:00
Matt Portune
b65b01fe3d Fixed potential broadcast leak & policy value parsing (#756) 2020-03-05 12:44:01 -05:00
Kyle Spearrin
b9c134654f Allows us to pass in some options to have policies enforced upon. (#755) 2020-03-05 10:11:54 -05:00
Kyle Spearrin
d1a1342587 New Crowdin translations (#754)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Belarusian)

* New translations copy.resx (Dutch)

* New translations copy.resx (Belarusian)

* New translations copy.resx (Belarusian)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Greek)

* New translations copy.resx (Greek)

* New translations copy.resx (Greek)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Italian)
2020-03-05 09:39:05 -05:00
Kyle Spearrin
1ec2ac472a Update ISSUE_TEMPLATE.md 2020-03-04 09:18:27 -05:00
Clayton
9894322c17 Update ISSUE_TEMPLATE.md (#752)
* Update ISSUE_TEMPLATE.md

Added a uniform template to be used for all issues that are reported.

* Update ISSUE_TEMPLATE.md

Added Beta Version, Build Version, and Videos to the list.
2020-03-04 09:11:38 -05:00
Matt Portune
7edbf4ffc8 Added null check for loading non-existent policies (#753) 2020-03-03 10:53:03 -05:00
Matt Portune
2b1d186611 New Android attachment handling to support saving or opening attachments (#751)
* New Android attachment handling to support saving or opening (when available) attachments

* Simplified options dialog logic & changed error text
2020-03-02 22:14:14 -05:00
Kyle Spearrin
70c49922b0 adjust setting.Value on empty string 2020-02-29 00:44:36 -05:00
Kyle Spearrin
30d6a4d9eb restrictions apparantly cannot have a null default value 2020-02-29 00:42:11 -05:00
Matt Portune
033b2b9ba0 Fixes for html wrapping and encoding (#746) 2020-02-28 15:20:59 -05:00
Matt Portune
25aec80e4c Change switch binding back to using EnforcedPolicyOptions directly (#744) 2020-02-27 23:14:26 -05:00
Matt Portune
cf3d52772d Fixed password color and alignment on iOS password generator (#743) 2020-02-27 21:18:09 -05:00
Matt Portune
f78f303a79 Password generator policy enforcement (#741)
* Password generator policy enforcement

* Formatting

* Changed to simple cast (double unboxing for int64/long)

* Added ui indication of active policy on password generator page and fixed issue with switch enable logic
2020-02-27 19:53:02 -05:00
Kyle Spearrin
02cffa01e2 formatting 2020-02-24 08:58:15 -05:00
Oldřich Jedlička
c2f2a5e52f Make callbacks from UI thread. (#739)
The code expects to be called form UI thread, but it loks like JavaScript
callbacks are not. Switch to UI thread when invoking a callback.

Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
2020-02-24 08:57:36 -05:00
Oldřich Jedlička
d8e19415e3 Fix runtime exception. (#738)
In the callback the processing does not go in the main UI thread, so we
need to switch there. Otherwise on Android this throws
Android.Util.AndroidRuntimeException with detail “Only the original thread
that created a view hierarchy can touch its views”.

Discovered by trying to login with Duo as a two-factor login type.

Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
2020-02-22 21:09:10 -05:00
Matt Portune
387dc2f59c Beginning of policy support (#736)
* Model & service support for policies

* Formatting

* Changes to match existing service and model patterns
2020-02-21 10:23:38 -05:00
Kyle Spearrin
ec3660a86d bitwarden inc 2020-02-18 22:39:35 -05:00
Vincent Salucci
36fb23d467 Add ability to clone personal vault items (#734)
* Add clone ability to personal vault items

* Fixed formatter

* Made requested changes and removed some extra whitespace added by Rider formatter

* Removed formatting on AppResources file

* Fixed casing on UpdateCipherId method

* Update calling method
2020-02-18 15:48:23 -06:00
Matt Portune
33df456cfd In-app vault export support (#729)
* First pass at vault export UI

* Password validation via cryptoService

* Export service framework

* support for constructing json export data

* Support for constructing csv export data

* Cleanup and simplification

* Completion of vault export feature

* Formatting and simplification

* Use dialog instead of toast for invalid master password entry
2020-02-14 16:10:58 -05:00
Kyle Spearrin
7a6fe5ed5f Check blacklist before showing overlay (#730) 2020-02-13 18:33:37 -05:00
Kyle Spearrin
558b10499b var 2020-02-12 09:40:16 -05:00
Kyle Spearrin
1fb3698ba2 support for appconfig settings (#727) 2020-02-10 14:07:06 -05:00
Kyle Spearrin
89f26bbc6b Migrate EnvironmentUrlsKey to pref storage (#725) 2020-02-10 11:32:58 -05:00
Matt Portune
bbd8615cda Align overlay to bottom or top of anchor view depending on available space (bottom by default on initial focus). Establishing visible app height now works much better on Android 5.0+. (#718) 2020-02-05 19:40:44 -05:00
Kyle Spearrin
93132f5d7b version bump 2020-02-03 09:26:29 -05:00
Matt Portune
179514ddf1 Support for multiple browser UriViewIds when extracting a uri (#713)
* Support for multiple browser UriViewIds when extracting a uri

* Simplified
2020-01-29 12:59:17 -05:00
Matt Portune
4b9cff2271 Removal of double-event block for known browsers since it's no longer necessary and was preventing the overlay from working with some browsers (#712) 2020-01-29 09:59:35 -05:00
Kyle Spearrin
c3649a9c80 formatting touchups 2020-01-29 08:46:21 -05:00
Matt Portune
9a66b9003f Made node recycling approach a bit more surgical to appease older versions of Android, and adjusted anchor position offset for older versions of Android (#711) 2020-01-29 07:23:49 -05:00
Matt Portune
34e32403b0 Accessibility fixes (#709)
* Show/hide accessibility overlay on scroll based on several visibility factors

* Improvements to accessibility overlay anchor view tracking

* Increase recursion limit and check for null children when walking the node tree

* Cleanup

* Hide overlay when expanding status (notification) bar

* use .Any() instead of .Count()
2020-01-27 17:36:20 -05:00
Kyle Spearrin
c2e34a8b0e skip linking on OldAndroidSSLSocketFactory 2020-01-27 08:22:46 -05:00
Matt Portune
d0ba4b6702 Accessibility overlay support for username field and scroll tracking (#700)
* Trigger overlay prompt when focusing on username field

* Adjust accessibility overlay position in response to scroll events

* Get username EditText with a single pass of the node tree, plus additional cleanup
2020-01-13 17:14:57 -05:00
Kyle Spearrin
eb16025800 tweaks to accessibility changes 2020-01-10 15:42:50 -05:00
Matt Portune
9f06c9a051 Removal of deprecated Android Accessibility Service options (#698) 2020-01-10 11:34:17 -05:00
Matt Portune
641122b16f UI support in app settings for handling overlay permission requirement in Accessibility Service implementation (#697)
* UI support in app settings for handling overlay permission requirement in Accessibility Service implementation

* Cleaned up shorthand operator with new var
2020-01-10 10:20:19 -05:00
Kyle Spearrin
fbe8708378 cleanup on accessibility service 2020-01-09 13:17:17 -05:00
Matt Portune
21c7b486ff Replaced accessibility service notification with in-line overlay. (#695)
* Replaced accessibility service notification with in-line overlay.  Requires draw-over permission to be enabled (will prompt if not, though this will be enhanced in subsequent commits)

* Updated with requested changes

* Fix for FDroid build
2020-01-09 12:17:16 -05:00
Matt Portune
c33728d418 * AccessibilityHelpers.cs: If (#689)
AccessibilityNodeInfo.FindAccessibilityNodeInfosByViewId(..) returns
  null when the source package is a supported browser, return a null
  uri to prevent overwriting the existing notification's pendingIntent
  uri extra with the brower's packageName.

* AccessibilityService.cs: Added null uri checks as it is now possible
  for AccessibilityHelpers.getUri(..) to return a null uri when the
  Accessibility Service is misbehaving.
2020-01-03 15:19:20 -05:00
ShirokaiLon
a9dacd561c Change password generator to use ColoredPassword (#686)
* Change password generator to use ColoredPassword

* Change ColoredPassword from FormattedString to HTML string for improved performance

* PasswordFormatter fixes

* Correct || to && condition

* Apply password colouring to history pages
2020-01-03 14:56:55 -05:00
Kyle Spearrin
051e15215d bump version 2019-12-26 15:15:15 -05:00
proletarius101
fee8f58c0a Add support for Tor browser (#680) 2019-12-26 07:29:20 -05:00
Kyle Spearrin
cc036cf3c5 Set lock page on resume for android 2019-12-16 09:43:14 -05:00
Kyle Spearrin
4e51517ddb update libs 2019-12-16 09:14:54 -05:00
Kyle Spearrin
3b7454961d New Crowdin translations (#663)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Persian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (English, United Kingdom)

* New translations copy.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Ukrainian)
2019-12-03 11:35:09 -05:00
Kyle Spearrin
88009e1a63 bump versions 2019-12-03 11:11:30 -05:00
Kyle Spearrin
0afca29b0c still load list if there are any ciphers 2019-11-22 09:51:30 -05:00
Kyle Spearrin
46a75a2944 Revert "try new http client handler for icons"
This reverts commit c099f82752.
2019-11-22 08:24:23 -05:00
Kyle Spearrin
c099f82752 try new http client handler for icons 2019-11-20 17:38:05 -05:00
Kyle Spearrin
1da94bd9c8 completed status on track release 2019-11-20 10:39:15 -05:00
Kyle Spearrin
96ce8165e9 upgrade to v3 publisher apis 2019-11-20 09:57:40 -05:00
Kyle Spearrin
f9b617339d try builds with VS 2019 preview 2019-11-20 08:25:52 -05:00
Kyle Spearrin
58084810f3 don't auto-capitalize password field when viewed 2019-11-20 08:24:08 -05:00
Kyle Spearrin
429e62e6b5 Don't index a "never" uri match. 2019-11-19 07:47:01 -05:00
Kyle Spearrin
b0b7f2afdf Merge branch 'master' of github.com:bitwarden/mobile 2019-11-15 08:55:31 -05:00
Kyle Spearrin
55f160d125 Show exception message from Api errors 2019-11-15 08:55:22 -05:00
Wasim Malik
f6352f5392 Updated Incorrect Check Condition (#648)
Issue is fixed No 361
Now tested on android device extra comma is not appended anymore
2019-11-12 16:28:12 -05:00
Kyle Spearrin
ac7e90c0aa blacklist com.android.settings from autofill 2019-11-08 11:57:07 -05:00
Kyle Spearrin
88fccfd6cd try setting http version 1.0 2019-11-05 09:14:55 -05:00
Kyle Spearrin
5fdf8e6045 set fingerprint lock prop on login 2019-11-05 09:03:48 -05:00
Kyle Spearrin
d9907cdbeb style fixes for xamarin forms 4 2019-10-30 09:30:45 -04:00
Kyle Spearrin
d308f1ca3b update libs and to xamarin forms 4 2019-10-30 08:27:40 -04:00
Kyle Spearrin
0cdc138ba3 dont immediatly prompt biometric when locked 2019-10-30 08:08:15 -04:00
Kyle Spearrin
59d5314164 New Crowdin translations (#639)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Vietnamese)
2019-10-23 20:55:51 -04:00
Kyle Spearrin
9c08a37772 UseNativeBiometric only for SDK 29 2019-10-23 11:54:53 -04:00
Kyle Spearrin
b13f5356fe FingerprintManager to detect fingerprints on SDK 28 2019-10-23 11:26:00 -04:00
Kyle Spearrin
5f0c9725ce bump version 2019-10-23 09:27:31 -04:00
Kyle Spearrin
f951fea555 use bio strings for native android bio 2019-10-23 09:24:34 -04:00
Kyle Spearrin
4b989b01e9 use native biomatrics on Android 2019-10-23 09:11:48 -04:00
Kyle Spearrin
aed3ec5474 check authed and unlocked before trying to load 2019-10-22 16:42:05 -04:00
Kyle Spearrin
b354986199 null check apiexception error 2019-10-22 16:37:40 -04:00
Kyle Spearrin
e1983a7d66 fix error when login token expires 2019-10-22 16:30:28 -04:00
Kyle Spearrin
0400d79f43 android 10 and bio permission 2019-10-18 20:41:04 -04:00
Kyle Spearrin
c911484632 upgrade builds to vs 2019 2019-10-18 14:21:07 -04:00
Kyle Spearrin
713e441d2e upgrade to android 10 sdk 2019-10-18 14:19:56 -04:00
Kyle Spearrin
d4b577732b npm audit fix 2019-10-17 08:01:50 -04:00
Kyle Spearrin
440a410d7f skip com.treydev.pns 2019-10-17 08:00:58 -04:00
Kyle Spearrin
37a536b138 catch thrown sync errors from ui 2019-10-15 11:05:56 -04:00
Kyle Spearrin
a0aca3e837 add tf browser 2019-10-11 09:29:33 -04:00
Kyle Spearrin
b58c29111a bump version 2019-10-07 09:42:55 -04:00
Kyle Spearrin
b0f86ea161 focus search bar on appear 2019-10-07 09:23:41 -04:00
Kyle Spearrin
93b59a75a4 remove migration code 2019-10-05 21:36:47 -04:00
Kyle Spearrin
54fcabaea6 shorter delays 2019-10-05 21:31:55 -04:00
Kyle Spearrin
0e966c0304 fix min character assignments for pw gen 2019-10-05 20:39:42 -04:00
Kyle Spearrin
a363712127 use black text for search bar on light theme 2019-10-04 09:32:59 -04:00
Kyle Spearrin
4d8c665917 fix light theme 2019-10-04 09:11:14 -04:00
kspearrin
53bdd92e72 support dark theme default on extensions 2019-09-30 21:40:05 -04:00
Kyle Spearrin
e51aa39ede New Crowdin translations (#614)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (German)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations copy.resx (Dutch)
2019-09-30 21:35:24 -04:00
Kyle Spearrin
33c82129ff bump version 2019-09-30 21:19:20 -04:00
kspearrin
7c5b8c0e9f modal full screen 2019-09-30 21:17:53 -04:00
kspearrin
9dc01bca1c detect dark mode theme. set modal to full screen 2019-09-30 20:38:22 -04:00
Kyle Spearrin
3c7920b84c XF 3.6 update 2019-09-30 20:33:54 -04:00
Kyle Spearrin
b92f3abbaf support dark theme logos 2019-09-30 16:52:20 -04:00
Kyle Spearrin
b6747a63ed stub out support for dark theme by default 2019-09-30 16:41:31 -04:00
Kyle Spearrin
41a44548d2 use TextColor for search bar text color 2019-09-30 16:33:53 -04:00
Kyle Spearrin
a79d3a0d7c uisearchbar tint color 2019-09-30 16:28:07 -04:00
kspearrin
f3a17709e5 get proper hex string from nsdata token 2019-09-30 16:24:35 -04:00
Kyle Spearrin
ced9d33d2e memory stored pinProtectedKey 2019-09-20 16:43:03 -04:00
Kyle Spearrin
23b1373f80 add tag to entitlement 2019-09-20 08:17:37 -04:00
Kyle Spearrin
a80eb1f533 bump version 2019-09-20 07:56:49 -04:00
Kyle Spearrin
f657edf195 add support for vivaldi browser. resolves #599 2019-09-10 17:21:11 -04:00
Kyle Spearrin
d34279dca5 more null checks on add/edit save 2019-09-06 10:03:11 -04:00
Kyle Spearrin
954aa1112a added locale names dictionary 2019-09-06 09:44:25 -04:00
Kyle Spearrin
b35a3339cb device type should be int 2019-09-06 09:44:25 -04:00
Kyle Spearrin
b59433debd New Crowdin translations (#594)
* New translations copy.resx (Bulgarian)

* New translations copy.resx (Bulgarian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Turkish)
2019-09-04 13:10:18 -04:00
Kyle Spearrin
fb2db9c652 version bump 2019-09-04 13:02:00 -04:00
Kyle Spearrin
2507f3301b device user agent 2019-09-04 11:52:32 -04:00
Kyle Spearrin
bdad5e4f0a fixes to opening file types on android 2019-08-30 16:43:58 -04:00
Kyle Spearrin
b5dcdc74d7 dark keyboard on dark themes. resolves #588 2019-08-28 20:27:15 -04:00
Kyle Spearrin
e2d1da02d3 more null checking on save 2019-08-27 15:03:33 -04:00
Kyle Spearrin
8253f18312 null check cipher service 2019-08-27 14:55:15 -04:00
kenjirooo
f4a98a2031 Added support for Sleipnir Mobile (https://play.google.com/store/apps/details?id=jp.co.fenrir.android.sleipnir). (#583) 2019-08-22 08:00:03 -04:00
Kyle Spearrin
224845cfd3 bump version 2019-08-12 09:41:12 -04:00
Kyle Spearrin
fc8c2ad67a add back references for autofill projects 2019-08-12 09:36:10 -04:00
Kyle Spearrin
c9d6f58563 delay for 1s on SyncIfNeeded 2019-08-12 09:35:18 -04:00
Kyle Spearrin
325b557506 null check on SyncIfNeeded 2019-08-12 08:51:49 -04:00
Kyle Spearrin
ce751cfc87 fix unlock logic 2019-08-12 08:05:45 -04:00
Kyle Spearrin
0f451fd4b9 set FingerprintUnlockKey before setKey 2019-08-10 00:19:01 -04:00
Kyle Spearrin
b7819838b8 parse fallback package id from first node title 2019-08-01 16:39:01 -04:00
Kyle Spearrin
67c6cf6b8c load previous view/edit page after lock 2019-07-31 16:50:16 -04:00
Kyle Spearrin
d91d71333b LastClipboardValue using static store rather than state 2019-07-31 11:21:07 -04:00
Kyle Spearrin
431804ea80 loop on reset with range instead of clear 2019-07-29 22:35:53 -04:00
Kyle Spearrin
7a7ab7bd0e New Crowdin translations (#570)
* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Russian)
2019-07-29 15:15:21 -04:00
Kyle Spearrin
b8cdee383b bump version 2019-07-27 12:42:42 -04:00
Kyle Spearrin
580fa02ee1 enable event logging 2019-07-27 12:41:38 -04:00
Kyle Spearrin
421834153d catch InteractionNotAllowed 2019-07-27 12:39:59 -04:00
Kyle Spearrin
011f04e1dc editorconfig 2019-07-26 11:44:43 -04:00
Kyle Spearrin
3d8056704c yubikey token entry is password field 2019-07-25 16:10:46 -04:00
Kyle Spearrin
41263f3419 New Crowdin translations (#569)
* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Polish)
2019-07-24 10:48:49 -04:00
Kyle Spearrin
9fe9210cb7 null check on id 2019-07-24 10:42:13 -04:00
Kyle Spearrin
2272b10820 null check on cipher when autofilling 2019-07-24 10:40:12 -04:00
Kyle Spearrin
9d6fc73fcc New Crowdin translations (#568)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Ukrainian)
2019-07-23 09:30:01 -04:00
Kyle Spearrin
73ecd67b20 New Crowdin translations (#567)
* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Estonian)
2019-07-23 09:16:10 -04:00
Kyle Spearrin
e5ce3dbd32 visibility typo 2019-07-23 09:11:01 -04:00
Kyle Spearrin
a0a5e30f48 re-work hockeyapp init 2019-07-23 09:08:16 -04:00
Kyle Spearrin
0eddee5816 check $LastExitCode 2019-07-23 00:10:25 -04:00
Kyle Spearrin
6d2dcb73ae event service func 2019-07-23 00:06:34 -04:00
Kyle Spearrin
0d6cc91b67 don't allow device PIN fallback 2019-07-22 23:34:39 -04:00
Kyle Spearrin
ae52922698 version bump 2019-07-22 23:07:00 -04:00
Kyle Spearrin
236496e69f formatting 2019-07-22 21:37:56 -04:00
kspearrin
fe5cdb0004 * CredentialProviderViewController.cs:
* LoadingViewController.cs: reset after using event service
2019-07-22 21:35:05 -04:00
Kyle Spearrin
f9547f158e log autofill events 2019-07-22 15:50:59 -04:00
Kyle Spearrin
0c75374c0f New Crowdin translations (#565)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Estonian)
2019-07-22 14:53:12 -04:00
Kyle Spearrin
0b249d4dd4 check yubico token length == 44 2019-07-22 13:59:12 -04:00
Kyle Spearrin
a2bac9d368 a11y labeling 2019-07-22 12:04:17 -04:00
Kyle Spearrin
392e429dfd more options button for ios on folder add/edit 2019-07-22 10:52:19 -04:00
Kyle Spearrin
50623b9b29 fix no folder reference 2019-07-22 10:52:04 -04:00
Kyle Spearrin
e7ce050324 use fingerprintButtonText on extension unlock 2019-07-22 10:24:18 -04:00
Kyle Spearrin
762b574d49 rebuild same fingerprintName string 2019-07-22 10:12:14 -04:00
Kyle Spearrin
d73bf6d225 assign new messageCallback when subbing 2019-07-22 09:21:00 -04:00
Kyle Spearrin
c2108fdda0 null checking 2019-07-22 08:44:55 -04:00
Kyle Spearrin
2062a284e3 fix lock checks on sleep of app 2019-07-22 08:37:06 -04:00
Kyle Spearrin
9164c9b946 InitAppIfNeeded 2019-07-22 08:22:02 -04:00
Kyle Spearrin
13ddd10c40 update autofill identities if needed 2019-07-22 07:09:51 -04:00
Kyle Spearrin
e407acd2a7 bump version 2019-07-13 20:28:20 -04:00
Kyle Spearrin
11cdf52ec8 disable events funcionality for now 2019-07-13 20:27:15 -04:00
Kyle Spearrin
40a3541e8e handle sleep event on ios manually 2019-07-13 20:25:31 -04:00
Kyle Spearrin
7da13e22ad process event uploads on ios 2019-07-12 20:56:54 -04:00
Kyle Spearrin
38d702b6fe log some events 2019-07-12 17:29:40 -04:00
Kyle Spearrin
df2af5459e register event service with container 2019-07-12 15:51:47 -04:00
Kyle Spearrin
40d68b1654 add event service 2019-07-11 09:30:25 -04:00
Kyle Spearrin
a240a4ac66 get autofill web scheme for android p devices 2019-07-11 08:55:40 -04:00
Kyle Spearrin
416ec3812d iphone x screenshots 2019-07-10 14:17:28 -04:00
Kyle Spearrin
ff24891903 update event log types 2019-07-09 10:51:33 -04:00
Kyle Spearrin
ddcbe298ac 6.5 inch screenshots for ios 2019-07-09 09:48:27 -04:00
Kyle Spearrin
6d8f647aee two new screenshots for iphone, update 1 2019-07-09 01:09:53 -04:00
Kyle Spearrin
a654987175 upadte screenshots for 5.5 inch iphone 6 2019-07-08 17:34:04 -04:00
Kyle Spearrin
a5f960d8a1 show proper name for faceid. homepage margin on ios 2019-07-08 13:37:45 -04:00
Kyle Spearrin
1f707cda68 New Crowdin translations (#556)
* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (French)
2019-07-08 13:12:09 -04:00
Kyle Spearrin
4e7f195fd2 bump versions 2019-07-08 13:02:48 -04:00
Kyle Spearrin
7728e930be delay focus on entry on ios too 2019-07-08 12:06:37 -04:00
Kyle Spearrin
ab84200347 change default lock on new installs to 15 minutes 2019-07-06 23:04:10 -04:00
Kyle Spearrin
62d8824450 clear cache in main app if change made in extension 2019-07-06 22:49:17 -04:00
Kyle Spearrin
cf35d20adb refresh search on appear if has text 2019-07-06 22:19:29 -04:00
Kyle Spearrin
65725b5a38 yubikey token must be > 40 in length too 2019-07-06 22:09:20 -04:00
Kyle Spearrin
eca4777b99 yubikey fixes for ios 2019-07-06 21:59:13 -04:00
Kyle Spearrin
066b3aba5b wait 5 seconds after migration 2019-07-05 17:37:21 -04:00
Kyle Spearrin
8e485ff26f add back refs for extensions 2019-07-05 17:14:08 -04:00
Kyle Spearrin
341b66f44f settings shim with ios group id 2019-07-05 17:10:37 -04:00
Kyle Spearrin
19c62d3320 Merge branch 'master' of github.com:bitwarden/mobile 2019-07-05 16:37:12 -04:00
Kyle Spearrin
13ffbd7675 add app extension flags to migration 2019-07-05 16:36:56 -04:00
Kyle Spearrin
9af6aae699 fix baseurl check when return web vault url 2019-07-05 13:46:54 -04:00
Kyle Spearrin
2e562e8318 ios migration from old version 2019-07-05 13:35:22 -04:00
Kyle Spearrin
c6db763716 New Crowdin translations (#554)
* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Ukrainian)
2019-07-04 08:43:40 -04:00
Kyle Spearrin
a3383af4ae hides shadow on nav bar 2019-07-03 20:39:00 -04:00
Kyle Spearrin
6c56e44b61 prefix keychain key with appid 2019-07-03 20:04:23 -04:00
Kyle Spearrin
64506a7080 UINavigationBar appearance for no bottom line 2019-07-03 17:37:33 -04:00
Kyle Spearrin
fac9ae4b6c only init hockeyapp once 2019-07-03 16:50:12 -04:00
Kyle Spearrin
a2dc73afef New Crowdin translations (#553)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)
2019-07-03 15:15:21 -04:00
Kyle Spearrin
59c5a34cd0 adjust bundle signing config 2019-07-03 15:03:09 -04:00
Kyle Spearrin
3321e6b0e2 set entitlements 2019-07-03 14:54:12 -04:00
Kyle Spearrin
8b7ac179fa in memory storage service 2019-07-03 12:31:18 -04:00
Kyle Spearrin
ea745665c8 remove continue button if no 2fa available 2019-07-03 12:21:06 -04:00
Kyle Spearrin
ca8f6ee10b FFImageLoading only for main app 2019-07-03 10:08:59 -04:00
Kyle Spearrin
3e51ff46f3 forget bg colors :( 2019-07-02 23:31:52 -04:00
Kyle Spearrin
fa2e814559 style headers and footer 2019-07-02 22:27:21 -04:00
Kyle Spearrin
87e337cbeb try color header bg again 2019-07-02 20:52:44 -04:00
Kyle Spearrin
abb39df547 reset service container from extensions 2019-07-02 20:45:54 -04:00
Kyle Spearrin
43e15bf911 more bg color for header 2019-07-02 20:14:23 -04:00
Kyle Spearrin
4d79d0af89 bg for header/footer is tint color 2019-07-02 19:49:50 -04:00
Kyle Spearrin
69100d7db5 search bar bg is same as list header 2019-07-02 19:36:11 -04:00
Kyle Spearrin
a064a6cf9b theme updates to extensions 2019-07-02 19:35:01 -04:00
Kyle Spearrin
7953a9a3ce autofill activated regular color 2019-07-02 17:28:57 -04:00
Kyle Spearrin
be3c6f210d remove see apps from ext page 2019-07-02 17:27:55 -04:00
Kyle Spearrin
f7cbddab4b remove navibar outlet 2019-07-02 17:17:20 -04:00
Kyle Spearrin
d423818764 add hockeyapp to extensions 2019-07-02 16:28:01 -04:00
Kyle Spearrin
519acd43aa provisioning profiles 2019-07-02 16:13:09 -04:00
Kyle Spearrin
2682a0d9e4 --nodevcodeshare on debug 2019-07-02 14:58:18 -04:00
Kyle Spearrin
8629ae048c update build props 2019-07-02 14:43:07 -04:00
Kyle Spearrin
905d01e804 adjust settings 2019-07-02 14:14:59 -04:00
Kyle Spearrin
0588bbc41d remove remaining jsonnet deps 2019-07-02 14:06:21 -04:00
Kyle Spearrin
b308b4c54f move some json dependencies out of extension project 2019-07-02 14:03:59 -04:00
Kyle Spearrin
c2c73d5460 autofill pages for ios 2019-07-02 13:15:00 -04:00
Kyle Spearrin
e01bf57874 re-set state for website icons on login/unlock
resolves #549
2019-07-02 08:05:34 -04:00
Kyle Spearrin
7ced93225b logic on autoPromptFingerprint when locked 2019-07-02 07:50:09 -04:00
Kyle Spearrin
b5e61864af adjust header for autofill page 2019-07-02 00:19:59 -04:00
Kyle Spearrin
1e5aaea8f4 restore lockOptionMs 2019-07-01 23:45:31 -04:00
Kyle Spearrin
ab3bebf06a use background tasks to keep timers alive 2019-07-01 23:44:47 -04:00
Kyle Spearrin
4a294d6a77 save some lines 2019-07-01 21:16:28 -04:00
Kyle Spearrin
e0fda1a0bc fix ui thread issue 2019-07-01 21:15:53 -04:00
Kyle Spearrin
d17da80f19 lock timer 2019-07-01 21:10:24 -04:00
Kyle Spearrin
2e7658f857 clear clipboard timer 2019-07-01 16:56:42 -04:00
Kyle Spearrin
53d0b28c7c fix add matching eq domains
resolves #550
2019-07-01 16:06:52 -04:00
Kyle Spearrin
33ba4d3871 add capitalize and include num to generator 2019-07-01 15:35:26 -04:00
Kyle Spearrin
225db6397d ios app extension theming 2019-07-01 15:12:54 -04:00
Nicholas
73b5d1b3f1 add support for org.mozilla.fenix.nightly (#551)
* Update autofillservice.xml

* Update AutofillHelpers.cs

* Update AccessibilityHelpers.cs
2019-07-01 11:35:58 -04:00
Kyle Spearrin
8da2eac6d0 add support for org.mozilla.fennec_fdroid
resolves #548
2019-06-28 23:23:51 -04:00
Kyle Spearrin
fbd62153ee theme splash for extensions 2019-06-28 12:30:48 -04:00
Kyle Spearrin
9145fa1c48 improvement to lock screen 2019-06-28 11:47:04 -04:00
Kyle Spearrin
caa0af1258 remove old action view controllers 2019-06-28 10:45:42 -04:00
Kyle Spearrin
7a230ee5f5 app extension for autofill ios 2019-06-28 08:57:08 -04:00
Kyle Spearrin
f237fa98d2 ios autofill extension implemented 2019-06-28 08:21:44 -04:00
Kyle Spearrin
be4ae605a9 implement ASHelpers from messages 2019-06-27 16:22:58 -04:00
Kyle Spearrin
9c2cbc0ecb add shared controllers and view to ios core 2019-06-27 15:48:25 -04:00
Kyle Spearrin
fb3009fc66 core utils 2019-06-27 14:07:25 -04:00
Kyle Spearrin
04c32e28cd move device action to ios core 2019-06-27 13:58:08 -04:00
Kyle Spearrin
645576c949 port over models 2019-06-27 13:45:16 -04:00
Kyle Spearrin
775bee3546 fix dependency hell 2019-06-27 13:41:32 -04:00
Kyle Spearrin
88aea96034 add autofill resources 2019-06-26 20:52:17 -04:00
Kyle Spearrin
5f474dfaf5 add some missing resources 2019-06-26 20:43:14 -04:00
Kyle Spearrin
fe7aad0835 autofill extension project 2019-06-26 20:39:45 -04:00
Kyle Spearrin
79746efa2d action extension project 2019-06-26 20:28:23 -04:00
Kyle Spearrin
a158021f46 return selection collection logic 2019-06-26 17:50:57 -04:00
Kyle Spearrin
2d91a893f7 fix cursor color to renderers 2019-06-26 10:20:42 -04:00
Kyle Spearrin
dd4561d985 style cursor color 2019-06-26 10:12:34 -04:00
Kyle Spearrin
92764eeae0 hide status bar on homepage for ios 2019-06-26 10:05:31 -04:00
Kyle Spearrin
b72808ab40 splash screen bg colors and white logo 2019-06-26 09:35:18 -04:00
Kyle Spearrin
14f3f99218 fix attachments selection on ios 2019-06-25 17:46:37 -04:00
Kyle Spearrin
d7130d9b67 no entities state adjustments 2019-06-25 17:16:47 -04:00
Kyle Spearrin
3f94eee4d5 events url 2019-06-25 16:36:21 -04:00
Kyle Spearrin
72cbdcbc8d use internal FilesDir for temp photo 2019-06-25 11:54:31 -04:00
Kyle Spearrin
e33b49e78c externalsFileDir w/ FileProvider for temp store 2019-06-25 10:30:16 -04:00
Kyle Spearrin
8e04945d4e box-row-input-options-platform on share 2019-06-24 17:38:29 -04:00
Kyle Spearrin
3ca5da55cb fix more options for sharing on view/add/edit 2019-06-24 17:34:00 -04:00
Kyle Spearrin
ea30373a09 picker SetUpdateMode for ios 2019-06-24 17:32:24 -04:00
Kyle Spearrin
4b4757d0e5 ios resumed 2019-06-24 17:02:05 -04:00
Kyle Spearrin
4bc837509d fix double key formatting 2019-06-24 16:51:54 -04:00
Kyle Spearrin
c9d1e8dc65 nord theme toast for ios 2019-06-24 16:29:02 -04:00
Kyle Spearrin
88b8a192b5 no listview selection type on non-light theme 2019-06-24 16:16:17 -04:00
Kyle Spearrin
94fbf627ba no options during selection mode 2019-06-24 15:22:46 -04:00
Kyle Spearrin
45fbdb8411 ios theming 2019-06-24 15:13:33 -04:00
Kyle Spearrin
d9c947ccd0 black theme for ios 2019-06-24 14:49:47 -04:00
Kyle Spearrin
2b670a5ae1 ios themeing 2019-06-24 14:29:23 -04:00
Kyle Spearrin
1af0178b50 set theme properly on app launch for ios 2019-06-24 12:23:00 -04:00
Kyle Spearrin
3ec5d894b3 spacing for ios on options page 2019-06-24 12:05:01 -04:00
Kyle Spearrin
d81585ccc3 search bar for ios 2019-06-24 11:53:19 -04:00
Kyle Spearrin
38f91bce1c notes separator for ios 2019-06-24 11:22:34 -04:00
Kyle Spearrin
2d41dd6ae0 switch styling on iOS 2019-06-22 09:51:04 -04:00
Kyle Spearrin
1705a21f68 slider styling 2019-06-22 09:45:54 -04:00
Kyle Spearrin
164d79898a button styling 2019-06-22 09:15:37 -04:00
Kyle Spearrin
50f809d290 undo busy when syncing complete 2019-06-21 16:53:17 -04:00
Kyle Spearrin
39284b475d bottom border on picker and no padding on editor 2019-06-21 16:36:23 -04:00
Kyle Spearrin
d44950d46c bottom border for ios entry 2019-06-21 16:09:20 -04:00
Kyle Spearrin
e9b55bc207 fix tag issue on settings page 2019-06-21 10:01:35 -04:00
Kyle Spearrin
5470f08fee list-row-header-container bg color 2019-06-21 09:59:22 -04:00
Kyle Spearrin
f9a3bbd7fa remove green background 2019-06-21 09:47:10 -04:00
Kyle Spearrin
9d3165dc65 New grid layout structure for cipher view cell 2019-06-21 09:46:46 -04:00
Kyle Spearrin
3475d39f37 use bold colored headers 2019-06-20 17:26:42 -04:00
Kyle Spearrin
44782b1ddf header upper on iOS 2019-06-20 17:05:28 -04:00
Kyle Spearrin
dd8d5fd84c icon sizes for ios 2019-06-20 16:49:27 -04:00
Kyle Spearrin
e8f2d9d0dd list section border colors 2019-06-20 16:40:13 -04:00
Kyle Spearrin
a2de3b5d80 remove binding context from header viewcell 2019-06-20 16:34:17 -04:00
Kyle Spearrin
a2960c45bc accessible font sizes 2019-06-20 16:32:22 -04:00
Kyle Spearrin
dc91624597 some listview styling for iOS 2019-06-20 16:02:39 -04:00
Kyle Spearrin
223ec180fc disable spell check & prediction on certain fields 2019-06-19 16:03:55 -04:00
Kyle Spearrin
0116572fec show nested collections in groupings pages 2019-06-17 10:21:05 -04:00
Kyle Spearrin
5350e5385c version bump 2019-06-16 06:57:25 -04:00
Kyle Spearrin
8f18c4fd45 cleartextTrafficPermitted 2019-06-16 06:54:58 -04:00
Kyle Spearrin
8538fbabe5 dont link core lib 2019-06-15 22:50:54 -04:00
Kyle Spearrin
9367b34bbe more linking 2019-06-15 21:58:43 -04:00
Kyle Spearrin
a766044cb4 bump version 2019-06-15 21:13:12 -04:00
Kyle Spearrin
0eb385e49f revert com.android.settings from blacklist 2019-06-15 21:02:38 -04:00
Kyle Spearrin
e30136dace just check if !HasCiphers 2019-06-15 20:44:36 -04:00
Kyle Spearrin
c50dee479a android http client handler 2019-06-15 18:44:08 -04:00
Kyle Spearrin
58ef292fa7 null checks 2019-06-15 00:14:32 -04:00
Kyle Spearrin
61b728fea7 x86 builds as well 2019-06-14 23:32:58 -04:00
Kyle Spearrin
b782eeb839 fixes to 2fa page 2019-06-14 18:08:08 -04:00
Kyle Spearrin
77314d4b8d cleanup search page for ios 2019-06-14 17:40:21 -04:00
Kyle Spearrin
c79d1d24b3 add and more toolbar buttons for ios 2019-06-14 17:31:06 -04:00
Kyle Spearrin
5dbea8ca09 more options on generator and history page 2019-06-14 17:21:17 -04:00
Kyle Spearrin
09a1c17fb4 null checks 2019-06-14 16:53:01 -04:00
Kyle Spearrin
a0632bcac2 null checks 2019-06-14 16:22:56 -04:00
Kyle Spearrin
07d57ebe8c bump version 2019-06-14 08:46:04 -04:00
Kyle Spearrin
325c88018c more menu for ios 2019-06-14 08:45:28 -04:00
Kyle Spearrin
dcb1102746 crash fixes 2019-06-14 08:05:28 -04:00
Kyle Spearrin
636d3c02c4 catch errors 2019-06-13 20:41:24 -04:00
Kyle Spearrin
5b119ded17 x64 builds as well 2019-06-13 16:25:13 -04:00
Kyle Spearrin
f25ae870c5 hebrew fix 2019-06-13 16:07:08 -04:00
Kyle Spearrin
49673262e4 bump version and fix readme 2019-06-13 15:05:31 -04:00
vargbeaumont
3ed814c1f7 Update styles.xml (#537)
Fix black navigation bar on none Google ROMs.
2019-06-13 15:03:00 -04:00
Kyle Spearrin
8b858e5407 new hi-res icon for store 2019-06-13 14:47:05 -04:00
Kyle Spearrin
30145894b6 bump version 2019-06-13 14:11:12 -04:00
Kyle Spearrin
8df4c27203 handle some loading race conditions 2019-06-13 14:08:21 -04:00
Kyle Spearrin
28166f79a1 ACCESS_NETWORK_STATE permission 2019-06-13 12:02:36 -04:00
Kyle Spearrin
2fe67137c5 more fdroid build cleanup of google services 2019-06-13 10:06:21 -04:00
Kyle Spearrin
a6ea2de691 bump version 2019-06-13 10:06:21 -04:00
Kyle Spearrin
7ffcde002e small delay before calling LoadAsync 2019-06-13 10:06:21 -04:00
Kyle Spearrin
a3f66b8ab1 chmod keystore correct path 2019-06-13 10:06:21 -04:00
Kyle Spearrin
43cee53dc8 make sure totp copy isn't available if not premium 2019-06-13 10:06:21 -04:00
Kyle Spearrin
6c5979040f New translations AppResources.resx (Hebrew) (#535) 2019-06-13 08:28:59 -04:00
Kyle Spearrin
666291d12d update publisher api 2019-06-13 00:54:42 -04:00
Kyle Spearrin
c04a8ccdc2 New Crowdin translations (#534)
* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese, Brazilian)
2019-06-12 23:00:39 -04:00
Kyle Spearrin
b13d2f7f91 dot for fallback text. resolves #531 2019-06-12 22:21:47 -04:00
Kyle Spearrin
0b56dd2795 null checks 2019-06-12 21:49:52 -04:00
Kyle Spearrin
028ebff102 activity key and unsub when activity destroyed 2019-06-12 21:49:43 -04:00
Kyle Spearrin
cd60c3da2a fixed size icons 2019-06-12 09:13:13 -04:00
Kyle Spearrin
3d239a3c2b selectable label effect 2019-06-12 08:31:33 -04:00
Kyle Spearrin
26d0077bb8 delay search to 500 ms 2019-06-12 08:12:55 -04:00
Kyle Spearrin
5dbe9e5ca2 add lots of misc thigns to appdelegate 2019-06-11 23:04:41 -04:00
Kyle Spearrin
5aac96edb5 remove XF reference 2019-06-11 22:27:39 -04:00
Kyle Spearrin
c45b62fa6e icons and splash screen 2019-06-11 22:20:59 -04:00
Kyle Spearrin
e05708979d close buttons for ios 2019-06-11 21:31:51 -04:00
Kyle Spearrin
b6e7db6ecf custom content page renderer for left nav items 2019-06-11 20:57:12 -04:00
Kyle Spearrin
17060a2a1b dont link on debug 2019-06-11 20:47:01 -04:00
Kyle Spearrin
389fbc31e9 bootstrap ios 2019-06-11 16:01:56 -04:00
Kyle Spearrin
da3c3c30e7 MtouchLink sdkonly 2019-06-11 15:41:32 -04:00
Kyle Spearrin
42a7086088 info and entitlements plists 2019-06-11 15:31:32 -04:00
Kyle Spearrin
5d4cc007bb bootstrap ios 2019-06-11 15:20:28 -04:00
Kyle Spearrin
a8dfb8e2b9 add back ios project 2019-06-11 14:46:11 -04:00
Kyle Spearrin
873999336f added ios core project 2019-06-11 11:07:56 -04:00
Kyle Spearrin
8476f53337 try create uri 2019-06-11 11:00:34 -04:00
Kyle Spearrin
31a77a6e19 autofocus prompt input 2019-06-10 23:18:34 -04:00
Kyle Spearrin
2376489f51 minor layout adjustments 2019-06-10 22:37:25 -04:00
Kyle Spearrin
0bfd9f386e fdroid button first 2019-06-10 22:07:06 -04:00
Kyle Spearrin
00e214871d .ToLocalTime() on view dates 2019-06-10 21:59:23 -04:00
Kyle Spearrin
fd41047923 layout adjustments 2019-06-10 21:53:12 -04:00
Kyle Spearrin
393882f57b size adjustments for cipher cell 2019-06-10 21:40:36 -04:00
Kyle Spearrin
313e3a3447 remove old layouts 2019-06-10 21:16:33 -04:00
Kyle Spearrin
23b3972503 catch bad regex parse 2019-06-10 20:47:30 -04:00
Kyle Spearrin
01a64676b4 re-enable appveyor regular builds 2019-06-10 17:01:27 -04:00
Kyle Spearrin
a8ee067215 copy/paste fdroid 2019-06-10 16:58:09 -04:00
Kyle Spearrin
504731885a add repo url info to fdroid page 2019-06-10 16:47:00 -04:00
Kyle Spearrin
76078348d6 style updates 2019-06-10 16:26:36 -04:00
Kyle Spearrin
464fb2144b limitations 2019-06-10 16:13:08 -04:00
Kyle Spearrin
c4e64ae80a bitwarden fdroid webpage 2019-06-10 16:09:34 -04:00
Kyle Spearrin
a614d6634a disable vs build 2019-06-10 15:42:40 -04:00
Kyle Spearrin
856d7905db dist is up one dir 2019-06-10 15:42:16 -04:00
Kyle Spearrin
5b4be62fb4 copy fdroid index html file to dist 2019-06-10 15:34:48 -04:00
Kyle Spearrin
44a58e3e9b test fdroid deploy 2019-06-10 15:32:50 -04:00
Kyle Spearrin
28b6d2ee2e bitwarden on fdroid index html file 2019-06-10 15:31:33 -04:00
Kyle Spearrin
d749095d08 New Crowdin translations (#526)
* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Hebrew)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Estonian)
2019-06-10 15:18:59 -04:00
Kyle Spearrin
2cdf2cbe19 remove "of apps" 2019-06-10 15:15:33 -04:00
Kyle Spearrin
06669bc77b rename npm package to bitwarden-mobile 2019-06-10 15:11:49 -04:00
Kyle Spearrin
6cd6b00ea6 clean l10n script 2019-06-10 15:11:01 -04:00
Kyle Spearrin
61bf43cd96 only deploy fdroid on release tag 2019-06-10 15:05:49 -04:00
Kyle Spearrin
3be53235a5 build whole solution 2019-06-10 14:50:26 -04:00
Kyle Spearrin
0f0d9f9a10 try cd 2019-06-10 14:40:38 -04:00
Kyle Spearrin
e6cfa84b73 cname dist 2019-06-10 14:38:33 -04:00
Kyle Spearrin
e5888e4b90 move cmd to ps 2019-06-10 14:28:05 -04:00
Kyle Spearrin
8e9e818c43 fixes for appveyor 2019-06-10 14:10:14 -04:00
Kyle Spearrin
5f41487fd2 fdroid-dist 2019-06-10 13:58:34 -04:00
Kyle Spearrin
3b7d3e2652 update appveyor for fdroid builds 2019-06-10 13:57:12 -04:00
Kyle Spearrin
5963cd35d5 fdroid assets 2019-06-10 13:36:03 -04:00
Kyle Spearrin
c4ebd8b6b7 fixes to locking 2019-06-10 13:19:05 -04:00
Kyle Spearrin
678640966e NormalizePassword 2019-06-10 13:09:42 -04:00
Kyle Spearrin
89f9394977 formatting 2019-06-10 12:58:54 -04:00
Kyle Spearrin
e7df752581 fix yubikey listening 2019-06-10 10:53:11 -04:00
Kyle Spearrin
dca567b00d _inited check on 2fa page load 2019-06-10 10:45:22 -04:00
Kyle Spearrin
5248df85ec transparent bg more button 2019-06-10 10:42:15 -04:00
Kyle Spearrin
31d39e0626 padding on cipher list item 2019-06-10 10:37:47 -04:00
Kyle Spearrin
5485bb574e font sizes for cipher cell on android 2019-06-10 10:02:09 -04:00
Kyle Spearrin
337965a7f7 set colors for cipher view cell 2019-06-08 22:29:22 -04:00
Kyle Spearrin
81cd2e26f4 more button click command 2019-06-08 13:04:06 -04:00
Kyle Spearrin
95c07334d7 website icons enabled property 2019-06-08 12:18:49 -04:00
Kyle Spearrin
2f66ee264b image and icon 2019-06-08 11:48:45 -04:00
Kyle Spearrin
5f16066641 autosize 2019-06-08 01:04:31 -04:00
Kyle Spearrin
6cdf84dcb7 wiring up cipher view cell elements 2019-06-07 15:52:47 -04:00
Kyle Spearrin
d7bfc64840 stub native cipher view cell for android 2019-06-07 14:35:44 -04:00
Kyle Spearrin
d199c83a61 null check 2019-06-07 10:31:41 -04:00
Kyle Spearrin
060e1a822f only prompt fingerprint if set 2019-06-07 10:12:11 -04:00
Kyle Spearrin
54141f77d6 no fade animations 2019-06-06 20:38:53 -04:00
Kyle Spearrin
d5c610b819 set generator page from tile if locked 2019-06-06 20:34:59 -04:00
Kyle Spearrin
a2bedaab8a try 1s delay on search to stop crashing 2019-06-06 16:18:44 -04:00
Kyle Spearrin
fa5c8c2c75 always focus search bar on appear, resolves #521 2019-06-06 09:39:48 -04:00
Kyle Spearrin
a2d00c4057 ResetWithRange once on search 2019-06-06 09:32:25 -04:00
Kyle Spearrin
cf9595a0bc only show autofill settings button when disabled
resolves #522
2019-06-06 09:14:32 -04:00
Kyle Spearrin
68d8b1fa3e catch disable display for nfc 2019-06-06 08:59:54 -04:00
Kyle Spearrin
6f905319c3 prompt fignerprint on resume of lock page 2019-06-06 08:04:54 -04:00
Kyle Spearrin
d6fd3edb3c nav bar background theming 2019-06-05 20:18:11 -04:00
Kyle Spearrin
5441c49d8d navigationBarColor black 2019-06-05 17:39:32 -04:00
Kyle Spearrin
c7938a8630 adjust toolbar after loading completes 2019-06-05 17:25:12 -04:00
Kyle Spearrin
bc0bb7c7bb fic editor renderer and add incognito to prompt 2019-06-05 16:48:54 -04:00
Kyle Spearrin
1c58d99006 add back app name and theme 2019-06-05 16:40:05 -04:00
Kyle Spearrin
e0c52dea3a generator tile and icon size adjustments 2019-06-05 16:37:54 -04:00
Kyle Spearrin
a1a5d3b363 dont need splash activity 2019-06-05 15:09:13 -04:00
Kyle Spearrin
9ae08932c2 support "no folder" short list on vault page 2019-06-05 14:27:34 -04:00
Kyle Spearrin
7d8dfb997e ShowNoData for main page 2019-06-05 13:59:08 -04:00
Kyle Spearrin
c8d8d94c7f placeholder colors 2019-06-05 12:32:40 -04:00
Kyle Spearrin
58f01493e0 darkbasedTheme 2019-06-05 12:19:53 -04:00
Kyle Spearrin
4a01116e93 catch any errors on OpenAccessibilitySettings 2019-06-05 12:09:05 -04:00
Kyle Spearrin
1cdc97f037 nord placeholder color 2019-06-05 12:00:15 -04:00
Kyle Spearrin
927c1a6799 set DisabledIconColor 2019-06-05 11:54:31 -04:00
Kyle Spearrin
8eec0c22d7 nord theme 2019-06-05 11:36:58 -04:00
Kyle Spearrin
9d86fac103 IsBusy on syncing 2019-06-05 09:39:30 -04:00
Kyle Spearrin
65f2ea1df2 stop blocking OnBackButtonPressed 2019-06-05 09:12:29 -04:00
Kyle Spearrin
4d54c8f1d1 resolve some todos 2019-06-05 08:58:11 -04:00
Kyle Spearrin
046f25c223 catch No public key when generating fingerprint 2019-06-05 08:37:07 -04:00
Kyle Spearrin
661cd79654 null check on parts 2019-06-05 08:29:27 -04:00
Kyle Spearrin
3b7078e565 try/catch on autofill service detection 2019-06-05 08:24:47 -04:00
Kyle Spearrin
e59ac5d65d generator buttons on different lines 2019-06-05 08:19:36 -04:00
Kyle Spearrin
67da9387ff take whole otpauth URI 2019-06-05 00:41:12 -04:00
Kyle Spearrin
c3f91761f6 HasCiphers and HasFolders props 2019-06-05 00:29:49 -04:00
Kyle Spearrin
a239ee80bc null checks 2019-06-05 00:21:45 -04:00
Kyle Spearrin
96275d8eec attempted workaround for arg outof range exception 2019-06-05 00:15:54 -04:00
Kyle Spearrin
1ef086a02c triedV1ReSync check 2019-06-04 23:39:58 -04:00
Kyle Spearrin
db10fee207 check internet connection on sync 2019-06-04 23:26:56 -04:00
Kyle Spearrin
279b53704b do full sync if no data is present 2019-06-04 23:25:09 -04:00
Kyle Spearrin
dbc750b44e request focus on email field for hint page 2019-06-04 23:16:57 -04:00
Kyle Spearrin
b29ccf67b1 load login page after registration 2019-06-04 23:07:35 -04:00
Kyle Spearrin
b67adf8789 properly parse error model 2019-06-04 22:48:03 -04:00
Kyle Spearrin
113eaef0d1 cleanup themes 2019-06-04 22:11:31 -04:00
Kyle Spearrin
6c88d25941 add locking to BroadcasterService 2019-06-04 21:28:50 -04:00
Kyle Spearrin
f6f6253eab catch exception on accessibility service running 2019-06-04 17:06:27 -04:00
Kyle Spearrin
8e1753ea37 sync date on settings list is local 2019-06-04 16:36:34 -04:00
Kyle Spearrin
83f8989d1f update screenshots 2019-06-04 16:36:25 -04:00
Kyle Spearrin
e1f5c97550 New Crowdin translations (#516)
* New translations AppResources.resx (Danish)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Spanish)
2019-06-04 12:40:15 -04:00
Kyle Spearrin
f8fa867154 Cipher.Login null check 2019-06-04 12:37:57 -04:00
Kyle Spearrin
f0893ca214 UriMatchType cast from int 2019-06-04 12:34:29 -04:00
Kyle Spearrin
82a58d9487 do you typo 2019-06-04 12:18:23 -04:00
Kyle Spearrin
d0ea6aedd0 appveyor updates 2019-06-04 12:01:51 -04:00
Kyle Spearrin
775d929711 migration settings are for prefs storage 2019-06-04 10:57:02 -04:00
Kyle Spearrin
5bae62cdcb New Crowdin translations (#513)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Estonian)
2019-06-04 10:56:55 -04:00
Kyle Spearrin
0a664c47b7 autofill not enabled prompt if migrated 2019-06-04 10:51:10 -04:00
Kyle Spearrin
f856e559a2 update readme 2019-06-04 10:08:56 -04:00
Kyle Spearrin
0283120934 New Crowdin translations (#512)
* New translations AppResources.resx (Afrikaans)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Catalan)

* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Hebrew)

* New translations AppResources.resx (German)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Estonian)
2019-06-04 10:08:37 -04:00
Kyle Spearrin
5237cbeab0 remove some old resource strings 2019-06-04 09:58:12 -04:00
Kyle Spearrin
15961c419e New Crowdin translations (#510)
* New translations AppResources.resx (Afrikaans)

* New translations copy.resx (Italian)

* New translations copy.resx (Norwegian Bokmal)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations copy.resx (Korean)

* New translations copy.resx (Korean)

* New translations AppResources.resx (Korean)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Afrikaans)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Hungarian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Norwegian Bokmal)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Persian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Hindi)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Hebrew)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Hebrew)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Catalan)

* New translations copy.resx (Catalan)

* New translations AppResources.resx (Catalan)

* New translations copy.resx (Bulgarian)

* New translations copy.resx (Bulgarian)

* New translations AppResources.resx (Bulgarian)

* New translations copy.resx (Afrikaans)

* New translations copy.resx (Czech)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Danish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Hebrew)

* New translations copy.resx (Danish)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (German)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (English, United Kingdom)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations copy.resx (English, United Kingdom)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (Estonian)

* New translations copy.resx (Turkish)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations copy.resx (Ukrainian)

* New translations copy.resx (Ukrainian)

* New translations AppResources.resx (Ukrainian)

* New translations copy.resx (Turkish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Vietnamese)
2019-06-04 09:49:42 -04:00
Kyle Spearrin
8b591a7f0c replace password copied 2019-06-04 09:48:08 -04:00
Kyle Spearrin
f7977c3435 cloc XAML 2019-06-04 09:42:11 -04:00
Kyle Spearrin
0c699e6c12 remove old boxedview 2019-06-04 09:38:31 -04:00
Kyle Spearrin
11e5b2ea5d rename main theme to light theme 2019-06-04 09:36:45 -04:00
Kyle Spearrin
fdfd2d20e6 fdroid builds 2019-06-03 23:54:40 -04:00
Kyle Spearrin
32adb7b91a store assets 2019-06-03 23:51:59 -04:00
Kyle Spearrin
237d31be28 add resx for other languages 2019-06-03 23:46:09 -04:00
Kyle Spearrin
ee07182157 ListItemBorderColor for dark theme 2019-06-03 23:33:48 -04:00
Kyle Spearrin
506ab12b95 sync on migrate if online 2019-06-03 23:26:57 -04:00
Kyle Spearrin
42d6a7c9b8 ShowAndroidAutofillSettings
ShowAndroidAccessibilitySettings
2019-06-03 23:20:59 -04:00
Kyle Spearrin
44530b63ca check internet connection 2019-06-03 23:12:54 -04:00
Kyle Spearrin
eadba95d5f settings screen 2019-06-03 23:01:31 -04:00
Kyle Spearrin
2574e0cba5 Add Site Prompt 2019-06-03 23:00:48 -04:00
Kyle Spearrin
e03cf94441 check internet connection before calling server 2019-06-03 22:43:52 -04:00
Kyle Spearrin
b38b801963 android tweaks 2019-06-03 22:19:51 -04:00
Kyle Spearrin
4f990ffe96 more imeFlags 2019-06-03 17:23:50 -04:00
Kyle Spearrin
8c54062c44 remove lock logging 2019-06-03 17:04:45 -04:00
Kyle Spearrin
9766ebc8e3 always set FingerprintLocked explicitly 2019-06-03 16:56:37 -04:00
Kyle Spearrin
07bc425046 more logging 2019-06-03 16:43:57 -04:00
Kyle Spearrin
d0b8c2c4bf more lock logging 2019-06-03 16:35:04 -04:00
Kyle Spearrin
83bc7c6d51 remove lock service logging 2019-06-03 16:25:43 -04:00
Kyle Spearrin
d64625aba2 more lock service logging 2019-06-03 16:07:45 -04:00
Kyle Spearrin
d1eec27fae lock service logging 2019-06-03 16:04:04 -04:00
Kyle Spearrin
43517fc4f6 set last active to 1 year ago 2019-06-03 15:50:26 -04:00
Kyle Spearrin
0e3eeab828 post migration 2019-06-03 15:44:05 -04:00
Kyle Spearrin
6b68e85077 check lock after migration 2019-06-03 15:32:40 -04:00
Kyle Spearrin
c9faa40475 don't migrate push:lastRegistrationDate 2019-06-03 15:15:00 -04:00
Kyle Spearrin
f8969675e7 only set default lock if unset 2019-06-03 15:07:19 -04:00
Kyle Spearrin
d620b70dac migration cleanup 2019-06-03 15:06:05 -04:00
Kyle Spearrin
4055f92831 migration cleanup 2019-06-03 14:52:16 -04:00
Kyle Spearrin
3e50461ea7 set passphrase defaults 2019-06-03 14:38:54 -04:00
Kyle Spearrin
5eee358059 sync when finished migrating 2019-06-03 14:32:43 -04:00
Kyle Spearrin
17b90c744c adjust defaults for pwGenerator migration 2019-06-03 14:25:29 -04:00
Kyle Spearrin
a78997771f only set pin when needed. sync after migration 2019-06-03 14:21:56 -04:00
Kyle Spearrin
3a691977aa remove reg date from migration 2019-06-03 14:08:27 -04:00
Kyle Spearrin
4bea105693 autofill save prompt is for preferences 2019-06-03 14:06:17 -04:00
Kyle Spearrin
0918e1d963 migrate push reg date 2019-06-03 14:03:24 -04:00
Kyle Spearrin
11ec9b320e proper type for push reg date on migration 2019-06-03 13:53:36 -04:00
Kyle Spearrin
97e98e1d9d more logging 2019-06-03 13:27:32 -04:00
Kyle Spearrin
e6dcdc51a4 more logging 2019-06-03 13:20:46 -04:00
Kyle Spearrin
702d27fea0 migration logging 2019-06-03 13:13:50 -04:00
Kyle Spearrin
59b086168a debug write line migration 2019-06-03 13:05:04 -04:00
Kyle Spearrin
57c89f5b2a log if needs migration 2019-06-03 12:54:31 -04:00
Kyle Spearrin
b69304992f log service 2019-06-03 12:52:46 -04:00
Kyle Spearrin
a5256a6491 remove device lock 2019-06-03 12:33:20 -04:00
Kyle Spearrin
8211f85725 lock on app restart 2019-06-03 12:30:26 -04:00
Kyle Spearrin
c27e44a7d2 autofill service page 2019-06-03 12:19:42 -04:00
Kyle Spearrin
22f16ea514 accessibility settings page 2019-06-03 12:05:18 -04:00
Kyle Spearrin
7ed45c3535 missing scroll view 2019-06-03 11:32:48 -04:00
Kyle Spearrin
a3716bc841 settings enabled/disabled text 2019-06-03 11:26:16 -04:00
Kyle Spearrin
e8c776fe49 implement blacklisted uris options for autofill 2019-06-03 11:08:33 -04:00
Kyle Spearrin
999c9667c8 dont process OnSaveRequest if prompt disabled 2019-06-03 11:01:08 -04:00
Kyle Spearrin
59620e6435 cleanup options page a bit more 2019-06-03 10:57:08 -04:00
Kyle Spearrin
cf4a6bb1a2 autosize notes 2019-06-03 10:46:05 -04:00
Kyle Spearrin
8658ebd6bb new autofill options 2019-06-03 10:45:27 -04:00
Kyle Spearrin
59f1dcca12 logged in as on 2019-06-03 09:58:35 -04:00
Kyle Spearrin
4382490823 black theme styling 2019-06-02 00:14:09 -04:00
Kyle Spearrin
479ad31325 black theme option 2019-06-02 00:08:20 -04:00
Kyle Spearrin
dd976b5b86 more black theme stub 2019-06-01 23:59:17 -04:00
Kyle Spearrin
18c2c1433b stub black theme 2019-06-01 23:42:42 -04:00
Kyle Spearrin
0fc013eb8a migrated messaging 2019-06-01 23:33:36 -04:00
Kyle Spearrin
1d95c73173 set type selected index later 2019-06-01 23:09:38 -04:00
Kyle Spearrin
312b6c2d44 pass _appOptions to load method 2019-06-01 22:44:15 -04:00
Kyle Spearrin
cab2b261b5 do not request focus on yubikey 2019-06-01 22:27:08 -04:00
Kyle Spearrin
2ddb384c80 blacklist com.android.settings 2019-06-01 21:27:30 -04:00
Kyle Spearrin
ca27b34122 focus yubikey token entry 2019-06-01 01:08:18 -04:00
Kyle Spearrin
5ce2eaf77e dont auto show fingerprint if lock is initiated 2019-06-01 01:07:02 -04:00
Kyle Spearrin
4ae02c27a4 old userid is string 2019-06-01 00:51:50 -04:00
Kyle Spearrin
50f71e7280 migration flag fix 2019-06-01 00:42:26 -04:00
Kyle Spearrin
638de90cc4 validating 2019-06-01 00:13:36 -04:00
Kyle Spearrin
d1646e5aca support old key on password unlock 2019-05-31 23:46:22 -04:00
Kyle Spearrin
ddd521cd4b migrate if necessary 2019-05-31 23:32:01 -04:00
Kyle Spearrin
f5b05ecd92 remove needs migration flag 2019-05-31 23:26:09 -04:00
Kyle Spearrin
4f2b76c442 finish migrate data helper 2019-05-31 23:23:58 -04:00
Kyle Spearrin
6aef106482 start some migration work for auth data 2019-05-31 17:49:51 -04:00
Kyle Spearrin
b191542ab7 ime NoPersonalizedLearning on entry and editor 2019-05-31 16:47:54 -04:00
Kyle Spearrin
e0e69920e9 masterPassOnRestart option for pin locking 2019-05-31 15:30:22 -04:00
Kyle Spearrin
f3edae9bb1 NoOrgsToList 2019-05-31 14:57:11 -04:00
Kyle Spearrin
0d5f5ec9ba init settings on tabs page changed 2019-05-31 14:18:32 -04:00
Kyle Spearrin
582799464f back button to groupings page on android 2019-05-31 14:15:37 -04:00
Kyle Spearrin
fc0d91d3e7 return type field focus on cipher add/edit 2019-05-31 14:10:49 -04:00
Kyle Spearrin
81b8c1716f color adjustments 2019-05-31 13:41:18 -04:00
Kyle Spearrin
b5d2a9a2fb return command for folders add/edit 2019-05-31 12:14:25 -04:00
Kyle Spearrin
a98283f3ff return commands for accounts pages 2019-05-31 12:13:14 -04:00
Kyle Spearrin
61be796c76 return commands on login page 2019-05-31 12:02:40 -04:00
Kyle Spearrin
dd090b0ed9 do once 2019-05-31 11:55:11 -04:00
Kyle Spearrin
6588b5bebb list section separator on settings page 2019-05-31 11:52:56 -04:00
Kyle Spearrin
aa3fd29508 list row separator 2019-05-31 11:40:53 -04:00
Kyle Spearrin
dcf412d94d border for sections 2019-05-31 11:36:44 -04:00
Kyle Spearrin
defac4e2d5 center numbers 2019-05-31 11:19:14 -04:00
Kyle Spearrin
6163a6dd77 fix slider history saves 2019-05-31 11:13:46 -04:00
Kyle Spearrin
32e757a873 update slider stroke 2019-05-31 11:03:32 -04:00
Kyle Spearrin
8df940447d save length and history when value done changing 2019-05-31 09:09:32 -04:00
Kyle Spearrin
ac6f3a6bb6 fix ip address matching on getdomain 2019-05-31 08:30:18 -04:00
Kyle Spearrin
46e631388d no need to catch apiexception 2019-05-31 08:18:18 -04:00
Kyle Spearrin
ff7c9f210c hide password and clear field on unlock 2019-05-30 23:48:39 -04:00
Kyle Spearrin
eecf81f0a5 verify fingerprint when enabling 2019-05-30 22:50:58 -04:00
Kyle Spearrin
b356627afd autofill rows on settings page 2019-05-30 22:45:48 -04:00
Kyle Spearrin
e3dcf4aed1 dont return null 2019-05-30 22:11:19 -04:00
Kyle Spearrin
4dd05cf10e remove boxedview 2019-05-30 22:09:28 -04:00
Kyle Spearrin
68a85a2561 myvault tile service 2019-05-30 22:05:50 -04:00
Kyle Spearrin
49cde1c67d icons updates 2019-05-30 21:59:02 -04:00
Kyle Spearrin
249dffe778 build number on about page 2019-05-30 21:25:54 -04:00
Kyle Spearrin
6d9b860c8b update tabbar 2019-05-30 21:24:03 -04:00
Kyle Spearrin
b1eabdfe86 main thread 2019-05-30 20:40:50 -04:00
Kyle Spearrin
ab9bbf7b0f save activity 2019-05-30 20:24:30 -04:00
Kyle Spearrin
cf2308a12d CipherListOptions on search page 2019-05-30 18:33:18 -04:00
Kyle Spearrin
0aa1359ad4 use current.mainpage 2019-05-30 18:27:57 -04:00
Kyle Spearrin
48c51173a1 CipherListOptions on autofill page 2019-05-30 17:24:41 -04:00
Kyle Spearrin
6838b32304 copy to remove no folder from list 2019-05-30 15:20:04 -04:00
Kyle Spearrin
60f81c5cba no need to check sync success 2019-05-30 15:15:58 -04:00
Kyle Spearrin
419cfceef1 needs migration flag 2019-05-30 15:11:22 -04:00
Kyle Spearrin
c7b62c8551 move some items needed for migration 2019-05-30 14:43:35 -04:00
Kyle Spearrin
a66489cd8c make AutofillServiceEnabled public 2019-05-30 14:21:15 -04:00
Kyle Spearrin
6d51864873 update tasks and sync on app start 2019-05-30 14:13:02 -04:00
Kyle Spearrin
dc7b37c8f2 accessibility service autofill 2019-05-30 12:37:35 -04:00
Kyle Spearrin
21bbb2af42 search icon 2019-05-30 12:04:31 -04:00
Kyle Spearrin
c3b9f4e5a8 run subscribed messages on main thread 2019-05-30 11:40:33 -04:00
Kyle Spearrin
70fa41ca3e clear clipboard alarm 2019-05-30 11:22:35 -04:00
Kyle Spearrin
49705b1074 use ValueHasBeenCopied string 2019-05-30 09:15:59 -04:00
Kyle Spearrin
32395dcb20 fixes 2019-05-30 08:45:39 -04:00
Kyle Spearrin
e34ca49b9b pop pages if cipher doesnt exist 2019-05-30 08:40:10 -04:00
Kyle Spearrin
46a8ffa5ae pop page on delete success 2019-05-30 08:35:50 -04:00
Kyle Spearrin
3f8f29dfe7 secondary menu on groupings page 2019-05-30 00:29:00 -04:00
Kyle Spearrin
67970afc1e log out on stamp mismatch when syncing 2019-05-29 23:41:43 -04:00
Kyle Spearrin
1c08901698 remove some todos 2019-05-29 23:37:25 -04:00
Kyle Spearrin
86d8d64bf6 CipherListOptions 2019-05-29 23:35:34 -04:00
Kyle Spearrin
cc8b8f9ceb restart app after theme change 2019-05-29 23:02:30 -04:00
Kyle Spearrin
6e91d66b2c white logo and popupTheme 2019-05-29 17:14:15 -04:00
Kyle Spearrin
886f356525 blue track color on dark theme 2019-05-29 16:55:13 -04:00
Kyle Spearrin
3fe7324cdf more theming 2019-05-29 16:44:18 -04:00
Kyle Spearrin
a1741fdd67 themeing 2019-05-29 15:50:20 -04:00
Kyle Spearrin
40484a7bf0 set theme on options change 2019-05-29 14:23:55 -04:00
Kyle Spearrin
48376d0a93 more options 2019-05-29 14:11:15 -04:00
Kyle Spearrin
6be54fa7ee disable favicons and totp copy fix for org 2019-05-29 09:55:48 -04:00
Kyle Spearrin
6c6da368dd options page 2019-05-29 09:36:57 -04:00
Kyle Spearrin
d70de04816 stub out options page 2019-05-29 09:08:47 -04:00
Kyle Spearrin
bf022f8a41 move settings page into folder 2019-05-29 09:05:24 -04:00
Kyle Spearrin
7046a010f9 remove XF 2019-05-29 08:40:16 -04:00
Kyle Spearrin
5cdccc7527 fix warnings 2019-05-29 08:27:58 -04:00
Kyle Spearrin
02552d0b24 add xf back to android project 2019-05-29 00:34:15 -04:00
Kyle Spearrin
026dd4761e hockeyapp 2019-05-28 23:14:02 -04:00
Kyle Spearrin
635dd5d4d5 non-debug is secure 2019-05-28 23:04:01 -04:00
Kyle Spearrin
81d972a462 thread policy 2019-05-28 23:03:03 -04:00
Kyle Spearrin
bfeddd6d99 forms only needs to be on main app project 2019-05-28 23:01:10 -04:00
Kyle Spearrin
437a60a967 crash fixes 2019-05-28 22:57:59 -04:00
Kyle Spearrin
6218c65ec6 prime expensive tasks 2019-05-28 17:18:27 -04:00
Kyle Spearrin
25d02cec25 load EEFLongWordList from file 2019-05-28 17:06:57 -04:00
Kyle Spearrin
0bbb549533 prime the word list 2019-05-28 16:39:10 -04:00
Kyle Spearrin
4ca5593d2e load on sync completed 2019-05-28 16:28:21 -04:00
Kyle Spearrin
630fc3f73c fix route for device token PUT 2019-05-28 16:20:24 -04:00
Kyle Spearrin
d66646d168 disable fdroid for now to speed of builds 2019-05-28 15:50:53 -04:00
Kyle Spearrin
ffe7771801 async await 2019-05-28 15:40:56 -04:00
Kyle Spearrin
5942bcc16d remove old autofill service 2019-05-28 15:34:49 -04:00
Kyle Spearrin
eb3d0d726f turn off rdp builds 2019-05-28 15:21:14 -04:00
Kyle Spearrin
a4846c7b11 remove ios projects for now 2019-05-28 15:05:28 -04:00
Kyle Spearrin
8e7ed05f25 firebase receivers 2019-05-28 14:53:23 -04:00
Kyle Spearrin
84d21efb5d enable rdp 2019-05-28 14:28:06 -04:00
Kyle Spearrin
68ee013114 multidex? 2019-05-28 13:54:13 -04:00
Kyle Spearrin
cd8a09ddef fdroid config profile 2019-05-28 13:50:01 -04:00
Kyle Spearrin
e1f6302280 remove json.net from ios core project 2019-05-28 13:41:39 -04:00
Kyle Spearrin
144197daaf play store publisher 2019-05-28 13:29:09 -04:00
Kyle Spearrin
57af4e0a03 merge fixes 2019-05-28 12:15:38 -04:00
Kyle Spearrin
309caa2f83 fix ios handler 2019-05-28 12:03:41 -04:00
Kyle Spearrin
3f11fdaa82 push notification services 2019-05-28 12:01:55 -04:00
Kyle Spearrin
faccb61a6b clear master password on login 2019-05-28 10:16:57 -04:00
Kyle Spearrin
786f3b4644 2fa for email 2019-05-28 10:12:51 -04:00
Kyle Spearrin
58d101659a listen to yubikey 2019-05-28 09:54:08 -04:00
Kyle Spearrin
822fc7f308 add/remove continue button 2019-05-28 09:12:05 -04:00
Kyle Spearrin
29ab7f7a30 touch ups on two-factor page 2019-05-28 09:04:20 -04:00
Kyle Spearrin
bf4f0bdba0 two-factor page UI 2019-05-27 11:57:10 -04:00
Kyle Spearrin
e8705d49f2 stub our 2fa page backend 2019-05-27 10:28:38 -04:00
Kyle Spearrin
6d49253ee5 stub out two factor page 2019-05-23 21:19:45 -04:00
Kyle Spearrin
23f27282d6 hybrid webview 2019-05-23 21:05:52 -04:00
Kyle Spearrin
bfa336b72d scan totp key 2019-05-22 21:10:04 -04:00
Kyle Spearrin
b5522c1b5e no async 2019-05-22 20:54:44 -04:00
Kyle Spearrin
543e3418a5 scan page 2019-05-22 20:54:17 -04:00
Kyle Spearrin
ea3dcd6250 add zxing lib 2019-05-22 20:28:31 -04:00
Kyle Spearrin
b8cbd5e0aa search for autofilling 2019-05-20 22:18:34 -04:00
Kyle Spearrin
29951207ec lock page work with autofill 2019-05-17 16:36:29 -04:00
Kyle Spearrin
3c58775ae2 fixes for autofill service 2019-05-17 15:43:14 -04:00
Kyle Spearrin
9ab41c5de6 populate add page from autofill 2019-05-17 15:24:15 -04:00
Kyle Spearrin
65f3a146fa autofill page fixes 2019-05-17 14:58:42 -04:00
Kyle Spearrin
22366ec0a2 autofill cipher 2019-05-17 14:46:31 -04:00
Kyle Spearrin
d038fb900e fuzzy autofill prop 2019-05-17 14:34:29 -04:00
Kyle Spearrin
13c5ebe065 disable favicons constant 2019-05-17 14:34:14 -04:00
Kyle Spearrin
4112e0a4c9 autofill actions 2019-05-17 14:34:00 -04:00
Kyle Spearrin
f73a5d6307 display alert action 2019-05-17 14:04:16 -04:00
Kyle Spearrin
a3e165fa06 some device functions 2019-05-17 13:46:32 -04:00
Kyle Spearrin
3e633dc38e stub out autofill ciphers listing page 2019-05-17 13:14:26 -04:00
Kyle Spearrin
d53bfae529 fix settings 2019-05-17 13:10:07 -04:00
Kyle Spearrin
9d491a3636 app options for add/edit page 2019-05-17 12:03:35 -04:00
Kyle Spearrin
c77d4b795a is locked inside if 2019-05-17 11:02:50 -04:00
Kyle Spearrin
c96daf2d68 logged in as and verify messages 2019-05-17 10:01:45 -04:00
Kyle Spearrin
961e23f0b8 face id strings 2019-05-17 09:46:36 -04:00
Kyle Spearrin
defb67c523 faceid detection 2019-05-17 09:45:07 -04:00
Kyle Spearrin
4aa1209bc7 fingerprint unlock 2019-05-17 09:42:20 -04:00
Kyle Spearrin
a7ad89471a update libs 2019-05-17 09:22:16 -04:00
Kyle Spearrin
1f74e102fa dont focus fields if using fingerprint locking 2019-05-16 17:31:08 -04:00
Kyle Spearrin
5761b47073 fingerprint locking 2019-05-16 17:30:07 -04:00
Kyle Spearrin
22a0b262e1 fingerprint setup 2019-05-16 16:31:58 -04:00
Kyle Spearrin
6e42f5ce7b use proper set lock option method 2019-05-16 16:00:16 -04:00
Kyle Spearrin
c5bd59e52c set pin from settings 2019-05-16 15:54:21 -04:00
Kyle Spearrin
c65b065dd7 lock option picker 2019-05-16 14:55:18 -04:00
Kyle Spearrin
3f8ab1bfe7 no need to schedule locking if already locked 2019-05-16 12:33:48 -04:00
Kyle Spearrin
cf41c5e090 lock now 2019-05-16 12:31:00 -04:00
Kyle Spearrin
290e90ba8e lock alarm 2019-05-16 12:30:20 -04:00
Kyle Spearrin
84c9516659 log user activity 2019-05-16 12:30:13 -04:00
Kyle Spearrin
3eb1ab0452 lock service fixes 2019-05-16 12:29:55 -04:00
Kyle Spearrin
f317f45d14 type change fix 2019-05-16 12:03:36 -04:00
Kyle Spearrin
5f6a3f4cb5 lock page fixes 2019-05-16 08:41:57 -04:00
Kyle Spearrin
27b6631cc1 lock page 2019-05-15 17:37:59 -04:00
Kyle Spearrin
f7bb091366 lock now button 2019-05-15 15:47:50 -04:00
Kyle Spearrin
5cf2092576 register lock service 2019-05-15 14:26:23 -04:00
Kyle Spearrin
954de743f5 lock service 2019-05-15 14:22:28 -04:00
Kyle Spearrin
8ab632e207 lock now string 2019-05-15 13:35:17 -04:00
Kyle Spearrin
547cd4e828 various settings 2019-05-15 13:26:55 -04:00
Kyle Spearrin
264028b623 rate app 2019-05-15 13:09:49 -04:00
Kyle Spearrin
2c302985f8 colon 2019-05-15 12:55:52 -04:00
Kyle Spearrin
d6f46cf5c5 fingerprint phrase and help settings 2019-05-15 12:54:48 -04:00
Kyle Spearrin
d4ed276684 hash phrase fixes 2019-05-15 12:53:01 -04:00
Kyle Spearrin
67e458833f settings about dialog 2019-05-15 09:14:49 -04:00
Kyle Spearrin
291c201b00 folder add/edit page 2019-05-14 17:25:58 -04:00
Kyle Spearrin
f9473ea61d folders page 2019-05-14 17:02:24 -04:00
Kyle Spearrin
b68031bd11 sync page details 2019-05-14 16:36:54 -04:00
Kyle Spearrin
879b5ef3aa stub sync page 2019-05-14 12:05:30 -04:00
Kyle Spearrin
ff1f895476 stub out settings page with a listview 2019-05-14 11:53:41 -04:00
Kyle Spearrin
3229835f50 load something for other tab pages 2019-05-14 09:51:13 -04:00
Kyle Spearrin
f0a96759a4 page name for groupings 2019-05-14 09:48:40 -04:00
Kyle Spearrin
4f4c6064db new tab page from code 2019-05-14 09:43:46 -04:00
Kyle Spearrin
df802152d7 tab page IsSwipePagingEnabled false 2019-05-14 09:20:03 -04:00
Kyle Spearrin
4f3a3a5b19 stub out settings page 2019-05-14 09:09:35 -04:00
Kyle Spearrin
cc7ccf921b generated password history page 2019-05-14 09:01:07 -04:00
Kyle Spearrin
4dfd8b6985 width on length label 2019-05-14 08:37:27 -04:00
Kyle Spearrin
919eedc0fa colored password property 2019-05-14 08:32:07 -04:00
Kyle Spearrin
9400c22e4f pass gen fixes 2019-05-13 16:06:56 -04:00
Kyle Spearrin
99f00b8e63 fix renderer namespaces 2019-05-13 15:25:20 -04:00
Kyle Spearrin
29d876eaed extended slider 2019-05-13 15:24:38 -04:00
Kyle Spearrin
018a7c9f96 generator UI elements 2019-05-13 14:43:23 -04:00
Kyle Spearrin
28473dd85f stub out password generator page functionality 2019-05-13 12:13:23 -04:00
Kyle Spearrin
29b37219c2 attachments page 2019-05-10 23:43:35 -04:00
Kyle Spearrin
34fd9b5842 stub attachments page 2019-05-10 14:33:33 -04:00
Kyle Spearrin
2b2787b187 collections page 2019-05-10 14:28:17 -04:00
Kyle Spearrin
253217cf20 changes based on add/edit mode 2019-05-10 14:09:13 -04:00
Kyle Spearrin
74c0e52458 secondary toolbar buttons 2019-05-10 13:47:59 -04:00
Kyle Spearrin
75cb67890d light overflow menu 2019-05-10 13:26:37 -04:00
Kyle Spearrin
9668bd85c1 share page 2019-05-10 13:22:35 -04:00
Kyle Spearrin
9aef584494 fix dialog resolve message 2019-05-10 13:22:25 -04:00
Kyle Spearrin
a535e8a82b null checks 2019-05-09 17:27:43 -04:00
Kyle Spearrin
3bd01067e3 collection management when adding new cipher 2019-05-09 16:55:11 -04:00
Kyle Spearrin
056b9fd2de fab on view page 2019-05-09 14:12:30 -04:00
Kyle Spearrin
da2ec4a38e favorite 2019-05-09 12:29:57 -04:00
Kyle Spearrin
fb5c36071d misc section with folders 2019-05-09 12:18:23 -04:00
Kyle Spearrin
b07afa7f11 fixes for custom field name prompt 2019-05-09 11:56:39 -04:00
Kyle Spearrin
a0e65fa75e custom field name prompt 2019-05-09 11:44:27 -04:00
Kyle Spearrin
866a20ed5a custom fields add/edit 2019-05-08 23:13:10 -04:00
Kyle Spearrin
49c355e52f manage URIS on add/edit 2019-05-08 16:49:32 -04:00
Kyle Spearrin
8d0dc2d230 update repeaterview to handle observables 2019-05-08 16:37:58 -04:00
Kyle Spearrin
cbda58f770 identity fields and notes 2019-05-08 15:00:45 -04:00
Kyle Spearrin
bb0ee239b4 pickers 2019-05-08 14:37:12 -04:00
Kyle Spearrin
0495c17fc8 fab padding and clicked action 2019-05-08 10:42:55 -04:00
Kyle Spearrin
2a5739dfdc fab 2019-05-08 08:33:17 -04:00
Kyle Spearrin
0b73317dd0 add some fields for various types 2019-05-07 23:22:55 -04:00
Kyle Spearrin
5dc4357078 padding/margins for entry/picker 2019-05-07 23:22:25 -04:00
Kyle Spearrin
cf2ae9d7e8 check tasks for completion 2019-05-07 23:21:56 -04:00
Kyle Spearrin
68c6537bcb fixes to cipher service 2019-05-07 13:58:50 -04:00
Kyle Spearrin
a236d7fbb1 stub out more add/edit page stuff 2019-05-07 12:29:02 -04:00
Kyle Spearrin
13267ff83d stub new add/edit page 2019-05-07 11:25:21 -04:00
Kyle Spearrin
8c31c7290c more do once and other cleanup 2019-05-06 23:30:54 -04:00
Kyle Spearrin
7d3ef39f67 more do once 2019-05-06 23:22:48 -04:00
Kyle Spearrin
51ee93eca0 better sizing on btn title 2019-05-06 23:18:13 -04:00
Kyle Spearrin
2816e72aa9 more do once checks 2019-05-06 23:07:47 -04:00
Kyle Spearrin
5ef4c96ee7 DoOnce helper 2019-05-06 22:49:57 -04:00
Kyle Spearrin
4ed12a859b cipher searching 2019-05-06 22:35:42 -04:00
Kyle Spearrin
128935eb9f searchbar on ciphers page 2019-05-04 00:14:49 -04:00
Kyle Spearrin
2553938380 material icons. stub out ciphers search page 2019-05-02 21:25:26 -04:00
Kyle Spearrin
59e412ea09 cipher password history page 2019-05-02 14:53:45 -04:00
Kyle Spearrin
9195bdcf95 style stweaks 2019-05-02 12:46:08 -04:00
Kyle Spearrin
2ca066327a re-org pages into folders 2019-05-02 12:27:23 -04:00
Kyle Spearrin
daa9bdfb8c improve home page spacing 2019-05-02 12:26:09 -04:00
Kyle Spearrin
faf690d899 environment page 2019-05-02 12:20:56 -04:00
Kyle Spearrin
9965121011 register page 2019-05-02 10:10:05 -04:00
Kyle Spearrin
15cda95c64 hint page 2019-05-01 15:53:56 -04:00
Kyle Spearrin
9678eab43f init login page 2019-05-01 15:29:57 -04:00
Kyle Spearrin
3b97fa0379 login page layout 2019-05-01 15:11:54 -04:00
Kyle Spearrin
c8368a2190 grouping counts 2019-05-01 12:28:49 -04:00
Kyle Spearrin
ba9605383d grouping types filter 2019-05-01 11:31:00 -04:00
Kyle Spearrin
caaec3ea57 fix password leaked check 2019-05-01 10:33:48 -04:00
Kyle Spearrin
a018369ae8 BaseContentPage on groupings page 2019-05-01 10:20:05 -04:00
Kyle Spearrin
b4f4f24c24 show activity indicator while still loading 2019-05-01 10:11:49 -04:00
Kyle Spearrin
9eeafcd027 accessibility service 2019-04-30 14:33:00 -04:00
Kyle Spearrin
464f4ba300 autofill service 2019-04-30 12:35:58 -04:00
Kyle Spearrin
cad56d438f more resources 2019-04-30 11:54:44 -04:00
Kyle Spearrin
5812dc7e7e more button on cipher listing 2019-04-30 11:27:53 -04:00
Kyle Spearrin
4a1bccd516 android resources 2019-04-30 10:40:51 -04:00
Kyle Spearrin
e46277c2ac preserve none folder filter 2019-04-30 09:55:28 -04:00
Kyle Spearrin
33684bd140 view page update info 2019-04-30 09:50:35 -04:00
Kyle Spearrin
865deaf401 null converters 2019-04-30 09:50:24 -04:00
Kyle Spearrin
1f4bdb04ee attachments on view page abd device actions 2019-04-29 16:09:27 -04:00
Kyle Spearrin
a5bf16a415 attachment listing 2019-04-29 14:35:44 -04:00
Kyle Spearrin
2a6fe3f351 move field view model 2019-04-29 13:56:36 -04:00
Kyle Spearrin
9468bb322d add I to ambiguous characters 2019-04-29 13:53:33 -04:00
Kyle Spearrin
9650e44078 field logic 2019-04-29 13:51:05 -04:00
Kyle Spearrin
134a4ec5d2 view page card and identity info 2019-04-29 10:20:29 -04:00
Kyle Spearrin
b7d87486a8 dont need to check target type of bool? 2019-04-29 10:00:59 -04:00
Kyle Spearrin
a75295662c null check 2019-04-29 09:59:33 -04:00
Kyle Spearrin
69eeb8bd23 fix logic on identity view address 2019-04-29 09:31:44 -04:00
Kyle Spearrin
65fe0e8f62 string has value converter 2019-04-29 09:31:34 -04:00
Kyle Spearrin
8fa2ef863f exposed password check 2019-04-27 00:19:44 -04:00
Kyle Spearrin
5e114e8074 colored password 2019-04-26 23:58:15 -04:00
Kyle Spearrin
223e8a5293 toggle password 2019-04-26 23:37:21 -04:00
Kyle Spearrin
aee9ce802a line break for box value 2019-04-26 22:59:53 -04:00
Kyle Spearrin
04bd6b49ad correct launch icon 2019-04-26 22:44:15 -04:00
Kyle Spearrin
e9d54d9cf5 remove css styling 2019-04-26 22:42:05 -04:00
Kyle Spearrin
9b2ce98b46 view page updates 2019-04-26 21:53:39 -04:00
Kyle Spearrin
d7312e2977 uris, fields, etc to view page 2019-04-26 16:58:20 -04:00
Kyle Spearrin
c2a168c6b7 styling boxes 2019-04-26 12:57:52 -04:00
Kyle Spearrin
a01f9c7351 totp text color changes with DynamicResource 2019-04-26 12:03:29 -04:00
Kyle Spearrin
dc0f9847c6 task.run ffimage init 2019-04-26 10:58:41 -04:00
Kyle Spearrin
7613f4191b init storage 2019-04-26 10:55:29 -04:00
Kyle Spearrin
1b613db534 task.run init 2019-04-26 10:54:02 -04:00
Kyle Spearrin
fb50123af0 init task 2019-04-26 10:40:28 -04:00
Kyle Spearrin
08c3aff60b litedb init 2019-04-26 10:30:41 -04:00
Kyle Spearrin
9cb141ef62 splash 2019-04-26 10:07:42 -04:00
Kyle Spearrin
baf77eb3a3 view page login info with copy buttons 2019-04-26 00:26:09 -04:00
Kyle Spearrin
0625f313dc repeater view 2019-04-25 11:43:45 -04:00
Kyle Spearrin
b644ed5a25 icon fixes 2019-04-24 23:53:36 -04:00
Kyle Spearrin
18ff6c7976 refreshing 2019-04-24 23:37:47 -04:00
Kyle Spearrin
be5fd8381f no data messages 2019-04-24 23:28:41 -04:00
Kyle Spearrin
003092a55b re-use groupings page for ciphers listing 2019-04-24 16:50:34 -04:00
Kyle Spearrin
3d50133fa8 search service 2019-04-24 14:52:26 -04:00
Kyle Spearrin
594a491251 move groupings page under vault 2019-04-24 11:25:18 -04:00
Kyle Spearrin
1cde9b8356 go to view page from groupings 2019-04-24 11:23:03 -04:00
Kyle Spearrin
b107df60e2 dark theme test 2019-04-22 17:23:11 -04:00
Kyle Spearrin
997ed42178 folder none translation 2019-04-22 17:10:28 -04:00
Kyle Spearrin
913cd23c45 cipher view cell and groupings styles 2019-04-22 17:08:37 -04:00
Kyle Spearrin
6cd1171fd5 theme variables 2019-04-22 14:17:33 -04:00
Kyle Spearrin
c3fe3292ad i18n extension 2019-04-22 13:47:45 -04:00
Kyle Spearrin
b48c231500 theming with resource dictionary 2019-04-22 11:32:17 -04:00
Kyle Spearrin
a6cd16cdb5 selected list cell transparent 2019-04-22 09:16:47 -04:00
Kyle Spearrin
2959577163 children default is empty list 2019-04-22 09:08:24 -04:00
Kyle Spearrin
efddb385d8 folder service bug 2019-04-22 08:54:43 -04:00
Kyle Spearrin
ea5a411f30 bug fixes 2019-04-19 16:57:34 -04:00
Kyle Spearrin
7548122e2d grouping listing 2019-04-19 16:45:16 -04:00
Kyle Spearrin
a4cbf3bee3 set main page 2019-04-19 16:40:20 -04:00
Kyle Spearrin
7f2c265965 sequentialize some methods 2019-04-19 16:38:20 -04:00
Kyle Spearrin
c6ce3e9480 convert to local functions to avoid continuewith 2019-04-19 16:15:29 -04:00
Kyle Spearrin
6d8af4d97a null check 2019-04-19 15:33:55 -04:00
Kyle Spearrin
60efcbaf02 empty ctors 2019-04-19 15:25:07 -04:00
Kyle Spearrin
3b63fbb61b no userid on cipher domain 2019-04-19 15:18:43 -04:00
Kyle Spearrin
2637587cf7 null checks 2019-04-19 15:18:26 -04:00
Kyle Spearrin
480f954433 changes for new messaging 2019-04-19 12:33:57 -04:00
Kyle Spearrin
7c1549bb95 re-worked message sending 2019-04-19 12:29:37 -04:00
Kyle Spearrin
4b7366e9b3 full sync on login 2019-04-19 09:57:19 -04:00
Kyle Spearrin
6288a06b49 login page 2019-04-19 09:42:55 -04:00
Kyle Spearrin
b3c67bab92 json property mapping 2019-04-19 09:25:15 -04:00
Kyle Spearrin
8c8fa8ae4c api error detection updates 2019-04-19 09:11:17 -04:00
Kyle Spearrin
0c93fc2662 home page buttons 2019-04-19 07:42:36 -04:00
Kyle Spearrin
aec2855db9 update message send type 2019-04-18 14:30:38 -04:00
Kyle Spearrin
2becf769c1 use new messaging and broadcaster services 2019-04-18 13:15:46 -04:00
Kyle Spearrin
da73a2f5d2 mobile broadcaster service 2019-04-18 12:53:05 -04:00
Kyle Spearrin
1dd5f9fc27 fix multiple i18n inits 2019-04-18 12:34:53 -04:00
Kyle Spearrin
e141991166 bootstrap 2019-04-18 12:31:35 -04:00
Kyle Spearrin
fff32e8086 register environment service 2019-04-18 12:21:35 -04:00
Kyle Spearrin
859788ca46 environment service 2019-04-18 12:19:17 -04:00
Kyle Spearrin
b94485be75 register services on android 2019-04-18 10:40:57 -04:00
Kyle Spearrin
43948c65f1 auth service 2019-04-18 09:45:31 -04:00
Kyle Spearrin
b61355a8fa update xamarin forms 2019-04-17 17:14:04 -04:00
Kyle Spearrin
8834492ec2 update xamarin forms 2019-04-17 17:13:53 -04:00
Kyle Spearrin
676e896d8c audit service 2019-04-17 17:10:21 -04:00
Kyle Spearrin
6d159740d9 remove preproject 2019-04-17 16:02:19 -04:00
Kyle Spearrin
f48aa24129 totp service 2019-04-17 16:01:07 -04:00
Kyle Spearrin
f46151bb71 password generation service 2019-04-17 15:23:26 -04:00
Kyle Spearrin
818414eb37 sync service 2019-04-17 12:12:43 -04:00
Kyle Spearrin
808fcea655 setup sync service 2019-04-17 09:38:20 -04:00
Kyle Spearrin
d050e01d08 interfaces 2019-04-17 09:09:54 -04:00
Kyle Spearrin
6cab060509 collection service 2019-04-17 09:07:51 -04:00
Kyle Spearrin
18f04af051 tree node traversal for folder 2019-04-17 08:46:51 -04:00
Kyle Spearrin
4b3bae5797 optional params 2019-04-16 23:31:05 -04:00
Kyle Spearrin
98291caf76 cipher service interface 2019-04-16 23:30:52 -04:00
Kyle Spearrin
a1a8c95ece cipher service methods 2019-04-16 20:43:54 -04:00
Kyle Spearrin
40b6460ac9 more cipher service functions 2019-04-16 17:34:59 -04:00
Kyle Spearrin
25c82ffd58 new apis 2019-04-16 17:21:04 -04:00
Kyle Spearrin
f76051d362 data model updates 2019-04-16 11:09:05 -04:00
Kyle Spearrin
351c99fb42 locale string comparer for i18n service 2019-04-16 11:08:28 -04:00
Kyle Spearrin
803527f585 locale string comparer for i18n service 2019-04-16 11:08:05 -04:00
Kyle Spearrin
d1c696bad5 new api endpoints 2019-04-16 11:07:44 -04:00
Kyle Spearrin
5d2f4e6ca4 api models 2019-04-16 11:07:32 -04:00
Kyle Spearrin
567ebcd06e more cipher service functions 2019-04-16 07:59:53 -04:00
Kyle Spearrin
1103354de3 new constants for mobile app prefixes 2019-04-16 07:44:18 -04:00
Kyle Spearrin
2fa3d214e5 make regex helpers public 2019-04-16 07:44:05 -04:00
Kyle Spearrin
7d6ec46ebe view updates 2019-04-16 07:43:56 -04:00
Kyle Spearrin
40598721f1 Url helpers 2019-04-15 18:17:19 -04:00
Kyle Spearrin
576f44a924 DomainName helper class for getting base domain 2019-04-15 16:16:53 -04:00
Kyle Spearrin
694e4960ad cipher service encrypt 2019-04-15 11:46:20 -04:00
Kyle Spearrin
4b67ba027e collection and folder models 2019-04-15 08:42:50 -04:00
Kyle Spearrin
eeb28f6ddf card view 2019-04-15 08:30:59 -04:00
Kyle Spearrin
4aa5ba2754 use crypto service 2019-04-15 07:56:46 -04:00
Kyle Spearrin
f228758fb7 domains and cipherview 2019-04-13 22:53:20 -04:00
Kyle Spearrin
d136eee224 field and password history domains/views 2019-04-12 17:21:21 -04:00
Kyle Spearrin
52a978a59a cipher data 2019-04-12 16:55:14 -04:00
Kyle Spearrin
8ade49c958 domains and view stubs 2019-04-12 16:39:20 -04:00
Kyle Spearrin
7c6c36b744 attachment models 2019-04-12 15:50:30 -04:00
Dustin C. Hatch
6c59bf8717 Android: Support autofill in Fennec F-Droid (#483)
The F-Droid build of Firefox (Fennec) has a different package name.
This name needs to be explicitly listed in order for autofill support to
work correctly.
2019-04-12 15:32:58 -04:00
Kyle Spearrin
87798612a6 more models 2019-04-12 11:42:45 -04:00
Kyle Spearrin
c89805d123 setup more models 2019-04-12 10:06:47 -04:00
Kyle Spearrin
a1ba2bf60b setup domain and view 2019-04-11 23:57:41 -04:00
Kyle Spearrin
87543f5beb api service interface 2019-04-11 23:57:05 -04:00
Kyle Spearrin
2e31a7b280 settings service 2019-04-11 16:27:45 -04:00
Kyle Spearrin
9fb2ce9297 mobile messaging service 2019-04-11 15:50:51 -04:00
Kyle Spearrin
567d527a71 fixes to i18n service 2019-04-11 15:43:13 -04:00
Kyle Spearrin
6ee109dc80 i18n service 2019-04-11 15:33:10 -04:00
Kyle Spearrin
6a65b6d735 platform utils init 2019-04-11 14:28:38 -04:00
Kyle Spearrin
b9838ecc4e service container 2019-04-11 14:14:34 -04:00
Kyle Spearrin
e1080f9be4 add app resources resx 2019-04-10 17:01:25 -04:00
Kyle Spearrin
115fa349d2 account apis 2019-04-10 15:35:23 -04:00
Kyle Spearrin
567161d8f3 auth apis and api helpers 2019-04-10 15:03:09 -04:00
Kyle Spearrin
579a7e0398 stub out beginnings of apiservice 2019-04-10 10:49:24 -04:00
Kyle Spearrin
0d417b3eee more device actions 2019-04-09 23:33:12 -04:00
Kyle Spearrin
9e51c46522 mobile platform utils 2019-04-09 23:24:03 -04:00
Kyle Spearrin
36780c5ef8 lots of enums 2019-04-09 17:14:16 -04:00
Kyle Spearrin
9e3ee50020 move some xamarin specific services to app proj 2019-04-09 17:10:56 -04:00
Kyle Spearrin
963b27fd71 state service 2019-04-09 17:01:55 -04:00
Kyle Spearrin
13a2206735 user service 2019-04-09 16:13:32 -04:00
Kyle Spearrin
929727ba41 token service 2019-04-09 10:35:21 -04:00
Kyle Spearrin
a0f6af8097 requires nuget refs 2019-04-09 10:00:32 -04:00
Kyle Spearrin
f79f93ba43 editor config with guideline at 120 2019-04-09 09:47:22 -04:00
Kyle Spearrin
0898e3cc09 no nuget packages directly 2019-04-09 09:33:08 -04:00
Kyle Spearrin
c68927c17a crypto service interface 2019-04-09 09:08:15 -04:00
Kyle Spearrin
9f740cf371 remove app reference 2019-04-08 21:42:19 -04:00
Kyle Spearrin
474ce458bf ios core lib 2019-04-08 21:38:17 -04:00
Kyle Spearrin
8c6823c463 key chain storage service 2019-04-08 21:23:16 -04:00
Kyle Spearrin
8055de4f25 shared name 2019-04-08 20:59:19 -04:00
Kyle Spearrin
d1c1aff7d9 mobile storage service 2019-04-08 20:54:59 -04:00
Kyle Spearrin
41321e3c9e json settings 2019-04-08 20:49:48 -04:00
Kyle Spearrin
992cf033f2 support more object types by using JSON strings 2019-04-08 20:48:18 -04:00
Kyle Spearrin
24b4073616 support bool type 2019-04-08 20:33:52 -04:00
Kyle Spearrin
4ef8ccaa8e support nullable preference types 2019-04-08 20:32:12 -04:00
Kyle Spearrin
f0eca137ef crypto service implementation 2019-04-08 16:04:41 -04:00
Kyle Spearrin
3f5115728b layout tweaks 2019-04-05 22:30:11 -04:00
Kyle Spearrin
3539d7389e cell buttons 2019-04-05 16:13:17 -04:00
Kyle Spearrin
8c79c42b28 entry cell renderer 2019-04-05 13:35:19 -04:00
Kyle Spearrin
1085808867 rename cell resources 2019-04-04 23:29:29 -04:00
Kyle Spearrin
0a5f9f1b23 remove description from base cell 2019-04-04 23:15:24 -04:00
Kyle Spearrin
8006bcf10c cleanup 2019-04-04 23:00:02 -04:00
Kyle Spearrin
61e95e03c8 BoxedView with LabelCell 2019-04-04 22:28:03 -04:00
Kyle Spearrin
2b2342bcad start writing crypto service 2019-04-03 14:21:54 -04:00
Kyle Spearrin
56b8bc1730 run sass on build 2019-04-03 10:05:37 -04:00
Kyle Spearrin
53aaf7caa8 back to sass 2019-04-02 23:41:17 -04:00
Kyle Spearrin
18f659de7b fix less 2019-04-02 23:22:37 -04:00
Kyle Spearrin
b2c0b02be4 move gulp tasks to sln root 2019-04-02 22:43:22 -04:00
Kyle Spearrin
61c1c6ebf8 build css from less 2019-04-02 22:15:11 -04:00
Kyle Spearrin
b837c600a8 remove css files from source 2019-04-02 21:47:36 -04:00
Kyle Spearrin
54a109345b support new moz browser in accessibility service 2019-04-01 12:57:51 -04:00
Kyle Spearrin
3a90b3beb6 theme manager 2019-03-29 21:23:34 -04:00
Kyle Spearrin
fe52324eea stylesheets 2019-03-29 17:54:03 -04:00
Kyle Spearrin
a1c853d7fc cipher view cell control 2019-03-29 16:52:57 -04:00
Kyle Spearrin
53974c4464 reorg groupings page 2019-03-29 13:24:44 -04:00
Kyle Spearrin
69ac98b2f6 vault groupings page list view stubbed 2019-03-29 12:52:57 -04:00
Kyle Spearrin
d84eece715 compile bindings 2019-03-29 09:16:22 -04:00
Kyle Spearrin
af7a456e96 more moz browsers for autofill 2019-03-29 08:48:48 -04:00
Kyle Spearrin
6088cfe266 resolves #477 2019-03-29 08:43:03 -04:00
Kyle Spearrin
02e03c7654 stub out various pages 2019-03-28 23:52:33 -04:00
Kyle Spearrin
30dd2e993f home page 2019-03-28 17:10:10 -04:00
Kyle Spearrin
574c826036 app id service 2019-03-28 16:45:00 -04:00
Kyle Spearrin
6d22888bf6 crypto function service interface 2019-03-28 16:06:55 -04:00
Kyle Spearrin
556741683d compare crypto alg 2019-03-28 16:04:38 -04:00
Kyle Spearrin
cb9dddc7a7 crypto function service 2019-03-28 15:43:50 -04:00
Kyle Spearrin
fca1dbd6ec secure storage service 2019-03-28 14:09:39 -04:00
Kyle Spearrin
364f25e22a fixes to PreferencesStorageService 2019-03-28 14:09:33 -04:00
Kyle Spearrin
9042702c09 use formatted key 2019-03-28 14:01:36 -04:00
Kyle Spearrin
86f1874379 playground app and json settings for litedb 2019-03-28 13:57:45 -04:00
Kyle Spearrin
781f838ce7 remove installLocation 2019-03-28 13:39:50 -04:00
Kyle Spearrin
addb7a0ecb fix connection string for litedb 2019-03-27 23:47:24 -04:00
Kyle Spearrin
21777602f6 storage services 2019-03-27 23:44:54 -04:00
Kyle Spearrin
a88f799372 rename lib to core 2019-03-27 21:36:28 -04:00
Kyle Spearrin
daee1a8e9d lib project 2019-03-27 21:34:39 -04:00
Kyle Spearrin
afd5d55b5f fontawesome icons 2019-03-27 21:26:57 -04:00
Kyle Spearrin
0f2d2ac7a9 themeing 2019-03-27 21:09:59 -04:00
Kyle Spearrin
a77bf9ddff stub out xamarin project 2019-03-27 20:12:44 -04:00
Kyle Spearrin
297beac169 reset for v2 2019-03-27 16:23:00 -04:00
Kyle Spearrin
5a7f106e3e restore secure flag 2019-03-15 23:00:22 -04:00
Kyle Spearrin
25636ac6ce remove secure flag 2019-03-15 23:00:06 -04:00
Kyle Spearrin
6d11921f45 exclude TextFlagMultiLine from autofill detection 2019-02-26 11:50:02 -05:00
Kyle Spearrin
05f6d6d156 opera touch support 2019-02-19 22:25:15 -05:00
Kyle Spearrin
b0cabbbfc2 parsed ShouldAutofill with app URL blacklist 2019-02-10 22:16:16 -05:00
Kyle Spearrin
4b9fa5041c bump version for ios 2019-02-04 08:56:19 -05:00
Kyle Spearrin
ed2ea75938 invoke Dispatch handler 2019-02-04 08:53:54 -05:00
Kyle Spearrin
a1fdc4a970 detect hidden field even when toggled 2019-01-25 09:08:13 -05:00
kspearrin
d20b3cadbf fix opening file on ipad 2019-01-25 08:55:26 -05:00
kspearrin
1374ee31ba remove additional ga refs 2019-01-25 08:55:26 -05:00
Kyle Spearrin
062f6b6665 remove whitespace 2019-01-24 14:46:27 -05:00
ShirokaiLon
8053e6cb81 Set Android InputType directly for the pin lock screen to force numeric-only keyboard layout. (#451)
* Set Android InputType directly for the pin lock screen to force numeric-only keyboard layout.

* Renamed variable
2019-01-24 14:45:42 -05:00
ShirokaiLon
60c5bbc73d Handle exception when adding attachment that does not exist on file system. (#449) 2019-01-22 15:53:48 -05:00
Kyle Spearrin
f0fb401d07 analytics not part of fdroid build any longer 2019-01-16 17:29:05 -05:00
Kyle Spearrin
6f3c302f28 missing null check 2019-01-16 16:38:12 -05:00
Kyle Spearrin
ba5495877c disable test nodes 2019-01-16 16:15:13 -05:00
Kyle Spearrin
2b8fe5fa98 New Crowdin translations (#445)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Korean)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Vietnamese)
2019-01-15 20:26:21 -05:00
Kyle Spearrin
c4253e63d2 Revert "New Crowdin translations (#440)"
This reverts commit 0694721e68.
2019-01-15 20:19:27 -05:00
Kyle Spearrin
8c1dc9c4ae Revert "New Crowdin translations (#443)"
This reverts commit bfddb2b4d6.
2019-01-15 20:19:17 -05:00
Kyle Spearrin
bfddb2b4d6 New Crowdin translations (#443)
* New translations copy.resx (Danish)

* New translations copy.resx (Czech)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Vietnamese)

* New translations copy.resx (Spanish)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (English, United Kingdom)

* New translations copy.resx (Finnish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (French)

* New translations AppResources.resx (English, United Kingdom)

* New translations copy.resx (Danish)

* New translations copy.resx (German)

* New translations copy.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (English, United Kingdom)

* New translations copy.resx (Czech)

* New translations copy.resx (Vietnamese)
2019-01-15 19:08:29 -05:00
Kyle Spearrin
b53ba52d05 en-gb support 2019-01-15 17:54:52 -05:00
Kyle Spearrin
0694721e68 New Crowdin translations (#440)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (English, United Kingdom)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (English, United Kingdom)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)
2019-01-15 17:35:48 -05:00
Kyle Spearrin
bc0084cc8b bump version 2019-01-15 11:33:57 -05:00
Kyle Spearrin
d3d4cca0e8 remove analytics settings 2019-01-15 11:30:13 -05:00
Kyle Spearrin
5b6becc63f remove analytics 2019-01-15 11:19:31 -05:00
Kyle Spearrin
7ed015aeb1 dont sub 1 when getting next random value 2019-01-13 22:11:01 -05:00
Kyle Spearrin
a8b84da17f New Crowdin translations (#429)
* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (French)
2018-12-27 09:22:21 -05:00
Kyle Spearrin
2d687c98df dont return if no identity 2018-12-24 11:29:12 -05:00
Kyle Spearrin
9c2a6da692 add qwant browser to autofill 2018-12-19 16:16:45 -05:00
Kyle Spearrin
ee9ecfbee9 revert colorized password on password generator 2018-12-15 16:56:06 -05:00
Kyle Spearrin
9d8a9387bc copy model password, not label text 2018-12-12 08:21:15 -05:00
Kyle Spearrin
8934cebc2a update fingerprint lib 2018-12-11 17:06:26 -05:00
Kyle Spearrin
c03a42e108 disable all install scripts 2018-12-11 10:16:17 -05:00
Kyle Spearrin
a39dfcf4d5 disable cloc 2018-12-11 10:15:56 -05:00
Kyle Spearrin
f25ab537f2 clear focus on cell 2018-12-11 10:13:17 -05:00
kspearrin
ff776e485a new instance of deviceservice 2018-12-10 11:56:07 -05:00
Kyle Spearrin
3b9f4433ad ClearExtensionCiphersCache 2018-12-10 11:48:35 -05:00
Kyle Spearrin
a8c18cf83a FormattedPassword formatting 2018-12-10 09:42:58 -05:00
Kyle Spearrin
dff91dc67d no folder fixes for groupings display 2018-12-10 09:41:21 -05:00
Kyle Spearrin
fdea212415 formatting fixes 2018-12-10 09:41:10 -05:00
Andreas Schneider
421f7e8799 Colorized passwords (#424)
* Added utility to format passwords using spans

* Use the password formatter to render the cipher password

* Colorize the password in the password generator
2018-12-10 09:30:11 -05:00
Kyle Spearrin
8fc5ad099b name short 2018-12-06 14:49:26 -05:00
Kyle Spearrin
0b1c0be0f0 support for showing groupings on ciphers list page 2018-12-06 14:17:28 -05:00
Kyle Spearrin
5cc1e2bb29 only show top level groupings on main vault page 2018-12-05 17:26:16 -05:00
Kyle Spearrin
c0eb84b7b1 bump version 2018-12-03 22:24:07 -05:00
Kyle Spearrin
66e8d955d9 allow cleartextTrafficPermitted for base config 2018-12-02 13:06:35 -05:00
Farzad E
e280f585cf Honor user CA store when targeting Android Nougat SDK and later (#420)
* Included network-security-config.xml file to honor user added CAs (see:
https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html)

* Added domain-config entry to only use system CAs connecting to bitwarden.com

* Deny all plaintext traffic from network_security_config


Ref: https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted
2018-12-02 08:56:16 -05:00
Kyle Spearrin
366578600b accessible typo 2018-11-30 11:28:35 -05:00
Kyle Spearrin
8611501423 nested tree node traversal helpers 2018-11-29 19:42:24 -05:00
Kyle Spearrin
8175af4e84 add steam support for otp generation 2018-11-29 17:10:51 -05:00
Kyle Spearrin
7ff628ea51 deprecate mac checks on RSA decrypt 2018-11-26 16:05:30 -05:00
Kyle Spearrin
5792372a47 bump version 2018-11-26 09:14:07 -05:00
Kyle Spearrin
9a169251d7 New Crowdin translations (#417)
* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)
2018-11-26 08:41:46 -05:00
Kyle Spearrin
2f0935dbbe update libs 2018-11-23 09:20:39 -05:00
Kyle Spearrin
5af7c7d58a Revert "comment out keyboard dismissal"
This reverts commit ed087b81b4.
2018-11-22 21:16:11 -05:00
Kyle Spearrin
9e1abb13a3 Revert "dont focus on cell tapped"
This reverts commit bbea5fe53c.
2018-11-22 21:16:02 -05:00
Kyle Spearrin
bbea5fe53c dont focus on cell tapped 2018-11-21 21:46:26 -05:00
Kyle Spearrin
ed087b81b4 comment out keyboard dismissal 2018-11-21 07:58:21 -05:00
Kyle Spearrin
0b06c87cb7 New Crowdin translations (#411)
* New translations AppResources.resx (German)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Spanish)
2018-11-20 22:48:03 -05:00
Kyle Spearrin
a9d204d3fa support attachment key, 100k iterations on regist. 2018-11-19 22:24:10 -05:00
Kyle Spearrin
36e263b9ff zh-HK gets traditional chinse 2018-11-15 08:23:45 -05:00
Kyle Spearrin
49af74729f update packages 2018-10-25 21:55:46 -04:00
Kyle Spearrin
aec0415cad New Crowdin translations (#398)
* New translations AppResources.resx (German)

* New translations AppResources.resx (Spanish)
2018-10-24 13:03:55 -04:00
Kyle Spearrin
8c8cec08e5 New Crowdin translations (#395)
* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Turkish)
2018-10-16 08:58:57 -04:00
Kyle Spearrin
8d0ee1caba bump version 2018-10-09 09:39:44 -04:00
Kyle Spearrin
a2a6d5a57f New Crowdin translations (#389)
* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Ukrainian)
2018-10-09 09:29:07 -04:00
Kyle Spearrin
9593f330db target android sdk 26 with fixes to HybridWebView 2018-10-08 23:21:29 -04:00
Kyle Spearrin
144d932591 null ref check 2018-10-08 15:04:18 -04:00
Kyle Spearrin
726db336a8 dont try to fill unless has username and password 2018-10-07 07:40:44 -04:00
Kyle Spearrin
8632f7cadc version bump 2018-10-06 19:26:54 -04:00
Kyle Spearrin
525b5fa19a null checks 2018-10-06 17:28:40 -04:00
Kyle Spearrin
b7c6b65a3d bump version 2018-10-03 00:35:06 -04:00
kspearrin
a4f93eea45 ios < 12 fixes 2018-10-03 00:29:42 -04:00
Kyle Spearrin
8d9a5bc08f formatting 2018-10-01 14:37:16 -04:00
Kyle Spearrin
28a93cdcb4 bump version 2018-10-01 14:19:28 -04:00
Kyle Spearrin
d32dd95e12 add minimum os version 2018-10-01 14:19:28 -04:00
kspearrin
f19a8a3cc5 os version checks on auth service apis 2018-09-29 12:14:44 -04:00
Kyle Spearrin
f8d5ee9d5d bump version 2018-09-26 12:38:26 -04:00
kspearrin
a98fb7d41e back button should be white 2018-09-26 12:36:31 -04:00
kspearrin
d2ccc5c022 remove min os 2018-09-25 14:35:41 -04:00
Kyle Spearrin
3339c8b676 fix navbar color on setup 2018-09-24 16:59:05 -04:00
kspearrin
2cc331b136 support loginSearchSegue when no service ids 2018-09-24 16:34:50 -04:00
Kyle Spearrin
df1a65e6a3 fix color on search nav bar 2018-09-24 16:20:17 -04:00
Kyle Spearrin
f416f95b77 reuse code 2018-09-24 16:11:54 -04:00
kspearrin
44fe5af4fb run on main thread fixes 2018-09-24 15:45:36 -04:00
Kyle Spearrin
f394eddc01 throttle fast type searches 2018-09-24 15:30:05 -04:00
kspearrin
07dd9df3ec no search display controller 2018-09-24 15:24:43 -04:00
Kyle Spearrin
340d4ce714 do searching 2018-09-24 15:08:16 -04:00
kspearrin
2870b8331e text changed 2018-09-24 14:57:28 -04:00
Kyle Spearrin
bc79f22e22 implement search delegate 2018-09-24 14:51:37 -04:00
Kyle Spearrin
b3e0b148a6 not translucent 2018-09-24 12:50:58 -04:00
Kyle Spearrin
6131dfeb2c add tint colors to search nav bar 2018-09-24 12:43:19 -04:00
kspearrin
42fc868b68 Search controller for autofill setup 2018-09-24 12:41:08 -04:00
Kyle Spearrin
e9ec02929d Revert "add login search view controller"
This reverts commit 389d7d77c2.
2018-09-24 11:25:43 -04:00
Kyle Spearrin
389d7d77c2 add login search view controller 2018-09-24 11:24:12 -04:00
Kyle Spearrin
03a55d38d3 move power manager check inside try/catch 2018-09-23 08:08:38 -04:00
Kyle Spearrin
5504298251 adjust check green color 2018-09-22 23:49:47 -04:00
Kyle Spearrin
0fff61de34 New Crowdin translations (#374)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)
2018-09-22 23:45:30 -04:00
Kyle Spearrin
4db7311611 remove period 2018-09-22 23:43:36 -04:00
Kyle Spearrin
650d970b5e fix GA service methods 2018-09-22 23:37:44 -04:00
Kyle Spearrin
7f796963f3 no need to install sdk 28 anymore 2018-09-22 23:31:42 -04:00
Kyle Spearrin
9231da2f1c Revert "remove credential provider from main app entitle"
This reverts commit 0d422c53d1.
2018-09-22 23:22:48 -04:00
Kyle Spearrin
0d422c53d1 remove credential provider from main app entitle 2018-09-22 23:05:21 -04:00
kspearrin
7bf9354e32 provide credentials if using fingerprint too 2018-09-22 22:06:12 -04:00
kspearrin
277fd67814 add bitwarden domain 2018-09-22 21:58:50 -04:00
Kyle Spearrin
68e9cd3779 only copy totp key is setting not disabled 2018-09-21 23:32:26 -04:00
Kyle Spearrin
73b2ae71a9 copy totp code. derp 2018-09-21 23:29:05 -04:00
kspearrin
f9028245d8 better handle service identifiers 2018-09-21 22:27:20 -04:00
Kyle Spearrin
3fff0617fe replace all on updates 2018-09-21 21:59:11 -04:00
Kyle Spearrin
d958dc6bce replace vs created on save 2018-09-21 21:53:04 -04:00
Kyle Spearrin
045ce42168 add alert for autofill extension 2018-09-21 21:52:46 -04:00
kspearrin
edef84a4f9 return instead of else 2018-09-21 20:40:34 -04:00
kspearrin
ec9b2d7f7d add item to cred store when added from extension 2018-09-21 20:22:13 -04:00
Kyle Spearrin
640beeed23 delete cipher messages passes object 2018-09-21 17:04:54 -04:00
Kyle Spearrin
a998ee84ec fix strings 2018-09-21 16:26:55 -04:00
kspearrin
bd74634201 spacing 2018-09-21 16:25:31 -04:00
Kyle Spearrin
364287028b autofill instructions 2018-09-21 16:20:17 -04:00
Kyle Spearrin
7be8513bb5 updated autofill tools page strings 2018-09-21 16:11:11 -04:00
Kyle Spearrin
89c2f62f11 autofill tools page for ios 12 2018-09-21 16:03:34 -04:00
Kyle Spearrin
fce2a7ba94 cleanup and updated resource strings for autofill 2018-09-21 15:32:12 -04:00
kspearrin
e613198252 updated 2018-09-21 15:15:02 -04:00
Kyle Spearrin
3e240c4d2f setup view controller during config 2018-09-21 15:06:23 -04:00
kspearrin
eee96bf8cf config flow 2018-09-21 14:29:42 -04:00
Kyle Spearrin
471871eb2e done use this. 2018-09-21 12:45:32 -04:00
Kyle Spearrin
225b8b8cd8 Merge branch 'master' of github.com:bitwarden/mobile 2018-09-21 12:45:16 -04:00
kspearrin
cb2d133eb0 remove base calls 2018-09-21 12:00:44 -04:00
kspearrin
d957111249 remove base method calls 2018-09-21 12:00:07 -04:00
Kyle Spearrin
f0a701e134 formatting 2018-09-21 11:25:44 -04:00
kspearrin
0c8c216fba only build id store if authed 2018-09-21 11:23:34 -04:00
kspearrin
f153c7509c build identity store for quick type bar 2018-09-21 11:22:06 -04:00
Kyle Spearrin
197683b722 messages for credential store 2018-09-21 09:57:24 -04:00
Kyle Spearrin
fbce0be457 listen to messages for credential store updates 2018-09-20 23:54:03 -04:00
Kyle Spearrin
24304c2f55 formatting 2018-09-20 23:50:02 -04:00
Kyle Spearrin
b0c6c09cea full sync and cipher modification messages 2018-09-20 23:47:19 -04:00
kspearrin
2732fc93f9 provide credential implementations 2018-09-20 23:24:59 -04:00
Kyle Spearrin
cc9a4a288a fix analytics for autofill events 2018-09-20 23:02:53 -04:00
kspearrin
f57db917d1 wire up shared view controllers 2018-09-20 22:53:23 -04:00
Kyle Spearrin
d32eb9c9bc copy classes to autofill 2018-09-20 22:24:13 -04:00
Kyle Spearrin
219af7f288 extract extension table source 2018-09-20 22:18:25 -04:00
kspearrin
e767b6c5be missing using 2018-09-20 22:06:53 -04:00
Kyle Spearrin
5f1a8017f1 moved view controllers to core library for reuse 2018-09-20 21:54:01 -04:00
kspearrin
df80122ce1 moved cipher model 2018-09-20 16:44:41 -04:00
kspearrin
6904ea118b basic autofill 2018-09-20 16:44:06 -04:00
kspearrin
0baa07daa2 load ioc and stuff 2018-09-20 13:18:30 -04:00
kspearrin
2abf407b36 move to default storyboard from xcode 2018-09-20 12:53:53 -04:00
kspearrin
55dc9cbfc7 log debug 2018-09-20 09:29:48 -04:00
Kyle Spearrin
fa15a10ae0 entitle main project for autofill 2018-09-19 23:18:53 -04:00
Kyle Spearrin
e821d8a135 reference autofill project 2018-09-19 23:10:26 -04:00
kspearrin
cefcc14d4d update autofill files 2018-09-19 23:08:39 -04:00
Kyle Spearrin
a52d1e1506 autofill project 2018-09-19 22:25:16 -04:00
Kyle Spearrin
42df1aecd5 New Crowdin translations (#371)
* New translations AppResources.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Korean)
2018-09-17 15:33:18 -04:00
Kyle Spearrin
920f4fc525 trim email 2018-09-15 23:36:32 -04:00
Kyle Spearrin
d57d583076 bump version 2018-09-14 16:36:38 -04:00
Kyle Spearrin
1c8cd2dcbb remove unused const strings 2018-09-12 15:53:27 -04:00
Kyle Spearrin
bb66a6c805 add firefox nightly, resolves #368 2018-09-10 08:17:22 -04:00
Kyle Spearrin
10ecdfbe31 add more autofill compat support 2018-09-06 00:17:26 -04:00
Kyle Spearrin
43dad1df63 dont need to rdp anymore 2018-09-05 17:37:05 -04:00
Kyle Spearrin
fdcc6b0cb8 change back to pwd, out-null 2018-09-05 17:19:53 -04:00
Kyle Spearrin
ac82d6bc6b update android using sdkmanager 2018-09-05 17:01:28 -04:00
Kyle Spearrin
a8e98cfa78 rdp for debugging 2018-09-05 16:37:13 -04:00
Kyle Spearrin
fa51314639 update-android for appveyor 2018-09-04 08:00:02 -04:00
Kyle Spearrin
3e0097c22c update android sdks on appveyor 2018-09-04 07:58:09 -04:00
Kyle Spearrin
e62ff2fe36 fix appveoyr yml 2018-09-03 23:05:54 -04:00
Kyle Spearrin
88a13eb54f update vs 2018-09-03 23:02:37 -04:00
Kyle Spearrin
355dc151c4 add more compat 2018-09-03 22:32:55 -04:00
Kyle Spearrin
4f0ea44078 update to android 9, test compat autofill mode. 2018-09-03 10:09:17 -04:00
Kyle Spearrin
9cc12fd577 check enabled too 2018-08-29 13:45:58 -04:00
Kyle Spearrin
960c2567bd can access premium for orgs 2018-08-29 12:36:44 -04:00
Kyle Spearrin
430e4dd445 rename UserPushNotification 2018-08-28 08:47:47 -04:00
Kyle Spearrin
1ec31c6899 add support for log out notification 2018-08-28 08:41:23 -04:00
Kyle Spearrin
42c21ce892 PBKDF2 is SHA256 2018-08-28 08:41:23 -04:00
kspearrin
d278fde5f2 fix missing params on extension 2018-08-24 17:10:52 -04:00
Kyle Spearrin
2616a5f500 bump versions 2018-08-21 16:29:31 -04:00
BestPig
cc58f7730e Use BaseUrl when opening web vault if defined (#360) 2018-08-20 13:32:16 -04:00
Kyle Spearrin
d49e001b21 New Crowdin translations (#358)
* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (Portuguese, Brazilian)
2018-08-16 15:18:21 -04:00
Kyle Spearrin
f12ceb69ce update public suffix list 2018-08-15 08:44:21 -04:00
Kyle Spearrin
7862005055 support for prelogin kdf params 2018-08-14 16:46:31 -04:00
Kyle Spearrin
e70dbf8d8d add UmAlQuraCalendar 2018-08-13 07:55:26 -04:00
Kyle Spearrin
16ee34d7a7 set calendars removed by linker 2018-08-13 07:54:08 -04:00
Kyle Spearrin
2ad55e8a8c New Crowdin translations (#353)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Ukrainian)
2018-08-09 17:34:58 -04:00
Kyle Spearrin
a8a1750d5c version bump 2018-08-09 11:48:10 -04:00
Kyle Spearrin
5407e20150 update libs 2018-08-04 00:55:01 -04:00
Kyle Spearrin
58aa37bf8e catch EnableForegroundDispatch exception. disable
back button on yubikey 2fa.
2018-08-01 15:45:32 -04:00
Kyle Spearrin
7c781b60c5 add protocol if missing 2018-08-01 15:32:12 -04:00
Kyle Spearrin
acdfce7e88 support otpath:// totp secrets 2018-07-31 12:34:10 -04:00
Kyle Spearrin
4e4b56d7fe password updated fixes 2018-07-30 22:42:54 -04:00
Kyle Spearrin
a3174d7015 New Crowdin translations (#349)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)
2018-07-30 17:14:39 -04:00
Kyle Spearrin
b595c8aeac contrib updates 2018-07-30 17:07:44 -04:00
Kyle Spearrin
a9a33ad71e save password history changes 2018-07-30 16:15:36 -04:00
Kyle Spearrin
4d08ce90cc Merge branch 'master' of github.com:bitwarden/mobile 2018-07-30 13:16:04 -04:00
Kyle Spearrin
01d9ccc110 add password history and updated dates 2018-07-30 13:15:53 -04:00
Jacob
029f069ad5 fetch image from bitwarden/brand (#345) 2018-07-19 10:51:15 -04:00
Kyle Spearrin
13b9e01604 check lock only if locked on all pages 2018-07-16 23:14:45 -04:00
Kyle Spearrin
19c46a472a fix name bug on section group names 2018-07-16 10:24:53 -04:00
Kyle Spearrin
37edfffb97 move last launch check after _lastQueriedUri 2018-07-16 10:17:05 -04:00
Kyle Spearrin
67fa653d06 prevent multiple main activities from autofill 2018-07-16 10:07:22 -04:00
Kyle Spearrin
366b9ddc4a update libs. update android security provider 2018-07-16 08:55:37 -04:00
Kyle Spearrin
c9354f79b8 add escosia browser autofill 2018-07-16 08:40:38 -04:00
Kyle Spearrin
d5b3bd5905 remove no connection alert on appearing of pages 2018-07-12 13:12:42 -04:00
Kyle Spearrin
45dd240415 include some type info with extension exception 2018-06-30 08:55:54 -04:00
Kyle Spearrin
bf99cea004 possible null pointer fix 2018-06-30 08:19:18 -04:00
Kyle Spearrin
f680b1e856 update libs 2018-06-30 00:06:41 -04:00
Kyle Spearrin
b2f40c7af0 fix track bug 2018-06-29 15:26:46 -04:00
Kyle Spearrin
82b17677b9 default track is alpha 2018-06-29 15:24:19 -04:00
Kyle Spearrin
b7df2d5441 rollout track 2018-06-29 15:05:40 -04:00
Kyle Spearrin
dd511ba365 tracks are now strings 2018-06-29 15:04:34 -04:00
Kyle Spearrin
d705e3c1fb version bump 2018-06-29 14:19:35 -04:00
Kyle Spearrin
4bd1322904 update libs 2018-06-29 14:09:53 -04:00
Kyle Spearrin
ac027ee3a0 add support for kiwi browser 2018-06-29 13:48:47 -04:00
Kyle Spearrin
e5e3ebdbba update to Xamarin forms 3.1 2018-06-29 12:45:10 -04:00
Kyle Spearrin
993fc2e6f4 bump version 2018-06-29 10:42:28 -04:00
Kyle Spearrin
61c480618c try to generate key with and without date 2018-06-29 10:39:29 -04:00
Kyle Spearrin
db7f2622c8 org.chromium.chrome support 2018-06-28 23:33:34 -04:00
kspearrin
a39e78a989 increment ios build num 2018-06-19 20:18:07 -04:00
Kyle Spearrin
5a461d68a7 New Crowdin translations (#330)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Ukrainian)
2018-06-19 20:07:48 -04:00
Kyle Spearrin
899816673c change icons server to bitwarden.net 2018-06-19 18:02:49 -04:00
Kyle Spearrin
84a10139c1 designer update 2018-06-19 14:28:31 -04:00
Kyle Spearrin
da3aa56d86 add ko and fa languages 2018-06-18 21:24:29 -04:00
Kyle Spearrin
a6dcd512ea update designer 2018-06-18 15:35:04 -04:00
Kyle Spearrin
572d32c1de New Crowdin translations (#329)
* New translations AppResources.resx (Bulgarian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Persian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Persian)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations copy.resx (Korean)

* New translations copy.resx (Korean)

* New translations copy.resx (Romanian)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Korean)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)

* New translations copy.resx (Vietnamese)
2018-06-18 15:30:24 -04:00
Kyle Spearrin
e8b67ead1e version bump 2018-06-18 15:23:11 -04:00
Kyle Spearrin
377029226e allow non-nfc keys on android 2018-06-18 14:10:43 -04:00
Kyle Spearrin
72d1421f1d shows both accessibility and autofill from tools 2018-06-18 13:59:56 -04:00
Kyle Spearrin
d359547dab monospace fonts for card code 2018-06-18 09:12:03 -04:00
Neil Burrows
9523c7ab33 Card Security Code masked (bitwarden/desktop issue 78) (#328)
* Card Security Code masked in the same way as Passwords. (bitwarden/desktop issue 78)

By default shows Card Security Code masked in the same way as Passwords. (bitwarden/desktop issue 78)

* Creating property to store value of Masked Card Code Shown
2018-06-18 09:00:45 -04:00
Kyle Spearrin
7cac07c185 add pbkdf2 key stretching 2018-06-13 22:41:18 -04:00
Kyle Spearrin
a607a7f3ef clear cache flag on disk 2018-06-08 09:13:42 -04:00
Kyle Spearrin
b5277e89d5 add bromite autofill support 2018-06-08 08:59:54 -04:00
kspearrin
99713f8ed7 remove password generate event on disappear 2018-06-05 11:13:15 -04:00
Kyle Spearrin
145dac500c appresources for ios yubikey 2018-06-04 21:08:55 -04:00
kspearrin
eefd9bf31c update yubikey options for ios 2018-06-04 21:06:17 -04:00
Kyle Spearrin
3f47ca645b iphone yubikey images 2018-06-04 21:02:20 -04:00
Kyle Spearrin
c906f037b5 checked for locked state on activity resume.
resolves #319
2018-06-04 09:20:38 -04:00
Kyle Spearrin
ffc4e32119 run cloc on install 2018-06-01 14:45:56 -04:00
Kyle Spearrin
51eb46241b Revert "previous 2017"
This reverts commit 541416f64b.
2018-05-29 15:54:57 -04:00
Kyle Spearrin
541416f64b previous 2017 2018-05-29 15:47:39 -04:00
Kyle Spearrin
14d1d132a3 dont set key validity dates 2018-05-29 15:21:43 -04:00
Kyle Spearrin
22a0045796 try again button for ios yubikey 2018-05-24 22:43:59 -04:00
Kyle Spearrin
2e5ba0335d hide yubikey token cell for ios 2018-05-24 22:40:02 -04:00
Kyle Spearrin
3315704c14 cleanup 2018-05-24 22:34:17 -04:00
Kyle Spearrin
f90c407fb6 move nfc delegate to member of appdelegate class 2018-05-24 22:33:29 -04:00
Kyle Spearrin
d3646e10a5 clearup yubikey reading on ios 2018-05-24 15:34:09 -04:00
Kyle Spearrin
d3003efe72 remove nfc from extension 2018-05-24 14:01:00 -04:00
Kyle Spearrin
235ca947be turn on nfc in plist 2018-05-24 13:50:11 -04:00
Kyle Spearrin
e7bc9ed5ba nfc updates 2018-05-24 12:49:22 -04:00
Kyle Spearrin
740a18dbc0 stub out yubico nfc support for ios 2018-05-24 11:41:57 -04:00
Kyle Spearrin
add5189bb1 add via to oreo trusted browsers 2018-05-21 23:26:54 -04:00
Kyle Spearrin
62002b8bb3 disable test nodes 2018-05-21 22:53:32 -04:00
Kyle Spearrin
41b4ee33fe adjust max_aspect ratio for samsung full screen 2018-05-20 10:14:54 -04:00
Kyle Spearrin
85c67ac676 version bump 2018-05-18 21:42:51 -04:00
Kyle Spearrin
4637b7d93f update fingerprint lib 2018-04-28 00:25:58 -04:00
Kyle Spearrin
8b9a178c87 faceid description in info.plist 2018-04-28 00:23:31 -04:00
Kyle Spearrin
c595c381a9 bump android version 2018-04-26 00:06:43 -04:00
Kyle Spearrin
c308d7a610 look for password fields from HtmlInfo attributes 2018-04-26 00:04:07 -04:00
Kyle Spearrin
f7570122c6 ignore "edit" fields on autofill 2018-04-26 00:04:07 -04:00
Kyle Spearrin
1e5f186b58 Search Login URI as well 2018-04-26 00:04:07 -04:00
kspearrin
b732b2ffa7 remove password debug code 2018-04-20 20:14:39 -04:00
Kyle Spearrin
617a7be4f3 version bump 2018-04-17 11:28:23 -04:00
Kyle Spearrin
5c5e368d6b comment out password debug 2018-04-17 11:03:36 -04:00
Kyle Spearrin
ff9f49416a track with node id + hash code 2018-04-16 11:01:32 -04:00
Kyle Spearrin
93cae0e9cc dont check ids 2018-04-16 09:00:51 -04:00
Kyle Spearrin
61e75ce747 remove UWP projects so CI will work 2018-04-16 08:28:17 -04:00
Kyle Spearrin
50affe26c5 update resources 2018-04-16 08:18:54 -04:00
kspearrin
8566362607 no need to update vs anymore 2018-04-15 22:00:21 -04:00
kspearrin
36925770d0 show ut8 password alert 2018-04-15 21:45:05 -04:00
kspearrin
d17ca1686e ignore recipient search fields 2018-04-15 21:02:55 -04:00
kspearrin
2ad709dae4 fix ipad crash on doc picker 2018-04-07 12:15:59 -04:00
kspearrin
5a3d86a12a Only adjust insets on phone devices 2018-04-07 11:32:01 -04:00
Kyle Spearrin
1a4ba36820 add support for via browser 2018-04-03 16:08:11 -04:00
Kyle Spearrin
ddeae3b5ba add support for Duo Organization 2FA 2018-04-03 15:59:58 -04:00
Kyle Spearrin
10df9e7cd5 multibutton alert, autofill and save new uri 2018-04-02 13:37:46 -04:00
Kyle Spearrin
be11933c60 remove persian language until further verification 2018-03-29 11:46:09 -04:00
Kyle Spearrin
d2db68b781 New Crowdin translations (#299)
* New translations AppResources.resx (Bulgarian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Persian)

* New translations copy.resx (Italian)

* New translations copy.resx (German)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations copy.resx (French)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Vietnamese)
2018-03-29 11:42:49 -04:00
Kyle Spearrin
da6e271584 refactor ignoresearch and password terms detection 2018-03-28 11:48:49 -04:00
Kyle Spearrin
5103c80e1e set default uri on add cipher 2018-03-26 17:06:58 -04:00
Kyle Spearrin
b5c80ea267 version bump 2018-03-22 12:01:17 -04:00
Kyle Spearrin
b5747fbb44 show/hide loading are async now 2018-03-22 11:07:41 -04:00
Kyle Spearrin
215ded8a77 fixes for match detection selection 2018-03-22 09:08:19 -04:00
Kyle Spearrin
e7ab6da068 fix param names for arg null exceptions 2018-03-21 07:35:27 -04:00
Kyle Spearrin
ee881f67ee version bump 2018-03-20 20:21:11 -04:00
Kyle Spearrin
f33248aa4f crash fixes 2018-03-20 20:19:44 -04:00
Kyle Spearrin
c6a40bac03 null checks on dialogs 2018-03-19 21:07:27 -04:00
Kyle Spearrin
aa38e79d08 resource update 2018-03-19 15:57:19 -04:00
Kyle Spearrin
9cac10e559 version bump 2018-03-19 10:24:54 -04:00
Kyle Spearrin
efbd418f56 New Crowdin translations (#296)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Ukrainian)
2018-03-19 10:15:52 -04:00
Kyle Spearrin
4ff3464abd new ic_launcher for adaptive icons 2018-03-17 17:26:10 -04:00
Kyle Spearrin
907ddbf903 collapse no folder listing if more than 99 items 2018-03-16 10:59:54 -04:00
Kyle Spearrin
7041991d5a android dialog is not cancelable 2018-03-16 10:42:07 -04:00
Kyle Spearrin
b26067e5da domain search term must be at least 3 characters 2018-03-16 10:41:53 -04:00
Kyle Spearrin
e519b13533 extension add login adjustments 2018-03-15 19:57:18 -04:00
Kyle Spearrin
30bc3867bf New Crowdin translations (#295)
* New translations AppResources.resx (Bulgarian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations copy.resx (Russian)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Persian)

* New translations copy.resx (Persian)

* New translations AppResources.resx (Persian)

* New translations copy.resx (Norwegian Bokmal)

* New translations copy.resx (Norwegian Bokmal)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Vietnamese)

* New translations copy.resx (Ukrainian)

* New translations copy.resx (Ukrainian)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Bulgarian)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Croatian)

* New translations copy.resx (Estonian)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Bulgarian)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (German)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)
2018-03-15 12:41:09 -04:00
Kyle Spearrin
5326c3aecc Match detection string 2018-03-15 10:37:08 -04:00
Kyle Spearrin
c95251c903 switch cell for fields, btn widths on ios too 2018-03-14 22:59:31 -04:00
Kyle Spearrin
e08a0a0938 cog alt buttons 2018-03-14 18:26:07 -04:00
Kyle Spearrin
fcb072c37d fix null ref when no uri 2018-03-14 17:41:18 -04:00
Kyle Spearrin
262c19b194 Change context options to action sheet w/ button 2018-03-13 17:33:45 -04:00
Kyle Spearrin
1031ddcd83 proper class on ExtendedViewCell 2018-03-12 22:46:46 -04:00
Kyle Spearrin
aaee0212f0 ios fixes 2018-03-12 15:42:53 -04:00
Kyle Spearrin
8fc95759ba support login uris from app extension 2018-03-12 13:29:12 -04:00
Kyle Spearrin
b6a3a0a54f noop on ios 2018-03-12 13:18:35 -04:00
Kyle Spearrin
e3091be314 Update ISSUE_TEMPLATE.md 2018-03-10 16:36:40 -05:00
Kyle Spearrin
045d0678b3 Create ISSUE_TEMPLATE.md 2018-03-10 09:47:52 -05:00
Kyle Spearrin
e3eeaddb3e normalize passwords 2018-03-09 22:29:59 -05:00
Kyle Spearrin
f2b202c714 only ignore vault.bitwarden.com 2018-03-08 10:34:07 -05:00
Kyle Spearrin
e6f3ad60ef move fields above attachments on view 2018-03-06 13:32:58 -05:00
Kyle Spearrin
fb6e0c9eb8 moved password generation link to button 2018-03-06 12:40:42 -05:00
Kyle Spearrin
fb6e488339 select URI match option from action sheet 2018-03-06 11:58:02 -05:00
Kyle Spearrin
0bccc8f0d5 loginUri no longer used 2018-03-06 08:51:05 -05:00
Kyle Spearrin
560d831e92 masked password string constant 2018-03-06 07:41:40 -05:00
Mark Cohen
7c8f6a1cc7 Don't leak password length through mask (#293) 2018-03-06 07:37:46 -05:00
Kyle Spearrin
deb1ead4ea trim Uri proper from stored json on save 2018-03-05 23:49:48 -05:00
Kyle Spearrin
005b2a4fb6 add support for uri match rules detection 2018-03-05 23:37:02 -05:00
Kyle Spearrin
4c8204f29a view/add/edit login uris 2018-03-05 22:39:56 -05:00
Kyle Spearrin
83fd19784a refactor for cipher model changes and multi-uris 2018-03-05 17:18:18 -05:00
Kyle Spearrin
1f21a2ecc7 add/edit/delete custom fields. remove field page. 2018-03-05 15:15:20 -05:00
Kyle Spearrin
c3f4d56d1e New Crowdin translations (#288)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Norwegian Bokmal)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations copy.resx (Russian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations copy.resx (Ukrainian)

* New translations AppResources.resx (Ukrainian)

* New translations copy.resx (Turkish)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Czech)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Hungarian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Vietnamese)
2018-02-27 23:49:47 -05:00
Kyle Spearrin
7e4f79bacb uppercase Bitwarden 2018-02-27 13:37:46 -05:00
Kyle Spearrin
b8267d4329 Uppercase Bitwarden 2018-02-27 13:27:07 -05:00
Kyle Spearrin
205ca693b3 crowdin update_option: update_as_unapproved 2018-02-20 16:17:15 -05:00
Kyle Spearrin
23159c2201 catch ActivityNotFoundException with alert 2018-02-14 17:11:27 -05:00
Kyle Spearrin
884521ced0 premium message on attachments edit page 2018-02-12 08:54:31 -05:00
Kyle Spearrin
aeb01ba292 break if too many iterations 2018-02-10 09:39:45 -05:00
Kyle Spearrin
2b1a556e9e re-enable vs update 2018-02-10 09:38:12 -05:00
Kyle Spearrin
d5c3ae3d19 guard against infinite recursion and loops 2018-02-10 09:35:14 -05:00
Kyle Spearrin
7654bb7088 check if child is same as parent 2018-02-10 00:38:52 -05:00
Kyle Spearrin
64c301caeb password gen fixes 2018-02-09 22:02:56 -05:00
Kyle Spearrin
e875b530b1 bail out if recursiveIterations >= 100 2018-02-09 16:23:51 -05:00
Kyle Spearrin
ee8c2b5272 thread sleeps 2018-02-09 15:00:54 -05:00
Kyle Spearrin
9b8bdb0639 remove log spam 2018-02-09 14:02:17 -05:00
Kyle Spearrin
1a99bbb040 more log info 2018-02-08 22:08:00 -05:00
Kyle Spearrin
0982b45473 more log spam 2018-02-08 17:44:48 -05:00
Kyle Spearrin
bcd210d504 log spam 2018-02-08 17:27:56 -05:00
Kyle Spearrin
c71608824b fix null ref with e.source 2018-02-08 17:07:01 -05:00
Kyle Spearrin
170876ac16 event info logs 2018-02-08 16:36:49 -05:00
Kyle Spearrin
a6b172c445 log and throw accessibility exceptions 2018-02-08 16:33:52 -05:00
Kyle Spearrin
e625450100 disable vs update 2018-02-08 16:00:11 -05:00
Kyle Spearrin
fca5447094 revert accessibility throttling 2018-02-03 09:47:16 -05:00
Kyle Spearrin
89f32beec5 throttle accessibility events 2018-02-03 09:21:27 -05:00
Kyle Spearrin
65eb7662ad remove appveyor debugging. just update vs 2018-02-03 00:00:05 -05:00
Kyle Spearrin
ea090dbe18 just update 2018-02-02 23:48:46 -05:00
Kyle Spearrin
5750817620 quiet update with echos 2018-02-02 22:30:00 -05:00
Kyle Spearrin
93386d0e8b passive update 2018-02-02 22:23:39 -05:00
Kyle Spearrin
e9dd7b8f98 update vs 2018-02-02 22:19:36 -05:00
Kyle Spearrin
5010e7cb7a update visual studio manually 2018-02-02 22:00:58 -05:00
Kyle Spearrin
fb35f4fbca Previous Visual Studio 2017 2018-02-02 13:49:44 -05:00
Kyle Spearrin
00c0a93a6b revert preview image 2018-02-02 13:45:26 -05:00
Kyle Spearrin
cd9a312e0b use VS preview image 2018-02-02 13:38:49 -05:00
Kyle Spearrin
8cdb27fe43 check modal stack before popping 2018-02-01 23:38:18 -05:00
Kyle Spearrin
d84d11d064 update xamarin forms 2018-02-01 23:38:06 -05:00
Kyle Spearrin
5d646a6112 various android crash fixes 2018-02-01 23:25:48 -05:00
Kyle Spearrin
dd334858ff add timeout on timers 2018-02-01 21:20:35 -05:00
Kyle Spearrin
dfd39ebc95 check installed launchers to skip 2018-02-01 21:20:28 -05:00
Kyle Spearrin
9dbb1f15a4 filter nova prime 2018-02-01 17:26:41 -05:00
Kyle Spearrin
32fd04a7d9 more filters 2018-02-01 17:23:41 -05:00
Kyle Spearrin
3a33ff375d turn back on autofill stuff 2018-02-01 17:17:18 -05:00
Kyle Spearrin
8877e71bd2 add back SystemUiPackage 2018-02-01 17:01:37 -05:00
Kyle Spearrin
5b5385c01d add FilteredPackageNames 2018-02-01 16:56:54 -05:00
Kyle Spearrin
9c365ecc48 log events 2018-02-01 16:27:08 -05:00
Kyle Spearrin
99d1a6d043 read RootInActiveWindow after launcher checks 2018-02-01 16:12:30 -05:00
Kyle Spearrin
854ef7e645 log any exceptions 2018-02-01 15:54:39 -05:00
Kyle Spearrin
a8eeb12325 just read RootInActiveWindow 2018-02-01 15:42:07 -05:00
Kyle Spearrin
86a3f516b1 test: start processing some event info 2018-02-01 15:29:41 -05:00
Kyle Spearrin
d6818939b3 test: turn some things back on 2018-02-01 15:21:22 -05:00
Kyle Spearrin
c51449e607 test: dont even init appsettings 2018-02-01 15:03:44 -05:00
Kyle Spearrin
333894ddeb test: do nothing for autofill service 2018-02-01 15:00:43 -05:00
Kyle Spearrin
052e227b65 comment out test nodes 2018-02-01 14:31:53 -05:00
Kyle Spearrin
4dd6df5bbe set package and website independently 2018-01-26 12:15:54 -05:00
Kyle Spearrin
8847991bba show attachments properly if an organization 2018-01-26 11:48:43 -05:00
Kyle Spearrin
0ffc6e4a1a show attachments if premium or org item 2018-01-26 11:02:35 -05:00
Kyle Spearrin
9a399e06f3 decrypt attachment with org id 2018-01-26 09:13:30 -05:00
Kyle Spearrin
6afccc2aea add duckduckgo support 2018-01-26 08:56:43 -05:00
Kyle Spearrin
8cd3a21468 null and length check on name when sorting 2018-01-25 21:20:45 -05:00
Kyle Spearrin
8b6d2d2b83 comment typo 2018-01-25 09:07:19 -05:00
Kyle Spearrin
a39f4d5987 split by no-break space for yandex 2018-01-25 09:06:01 -05:00
Kyle Spearrin
e236d045b0 use MasterPasswordConfirmationValMessage 2018-01-24 20:21:54 -05:00
Alistair Francis
592c7951df UWP: Add a ExtendedTableViewRenderer (#260)
Add a base ExtendedTableViewRenderer we can use.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-19 14:04:58 -05:00
Kyle Spearrin
41efa96291 unsub from yubikey events on disappearing 2018-01-18 13:24:23 -05:00
Kyle Spearrin
53f406a267 log out after 5 failed pin attempts 2018-01-18 13:18:08 -05:00
Kyle Spearrin
1390df48b6 use random key for double hmac comparisons 2018-01-18 09:31:22 -05:00
Kyle Spearrin
01878ef00c check that mac always exists if key has MacKey 2018-01-18 08:39:34 -05:00
Kyle Spearrin
6f119f25f4 missing props on TokenCell 2018-01-18 08:09:18 -05:00
Alistair Francis
3f31d78db1 Add YubiKey keyboard support (#248)
* App: Pages: Fix the YubiKey image source

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Allow YubiKey keyboard output on apps

On Android and UWP it's possible to use the YubiKey to enter text
instead of using the NFC. Allow people to do that.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Enable YubiKey support on Windows platforms

Windows platforms should always have YubiKey support.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-18 07:55:06 -05:00
Alistair Francis
014bf7777b Update some images (#257)
* UWP.Images: Update the launch.png image size

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Update login toolbar button

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-17 08:29:59 -05:00
Kyle Spearrin
7191969e9c Update README.md 2018-01-14 21:43:25 -05:00
Kyle Spearrin
0950510526 scope if shorthand 2018-01-11 12:07:13 -05:00
Kyle Spearrin
9eba3064a7 formatting 2018-01-11 12:02:03 -05:00
Kyle Spearrin
a4d785258e build for configuration release 2018-01-11 09:04:58 -05:00
Kyle Spearrin
efef49f976 Revert "choose/when fdroid conditional on packages"
This reverts commit b3573f9482.
2018-01-11 09:03:05 -05:00
Kyle Spearrin
32a7b5bafb Revert "clean and rebuild FDroid"
This reverts commit 5fa080063c.
2018-01-11 09:00:29 -05:00
Kyle Spearrin
5fa080063c clean and rebuild FDroid 2018-01-11 08:52:47 -05:00
Kyle Spearrin
b3573f9482 choose/when fdroid conditional on packages 2018-01-11 08:36:37 -05:00
Kyle Spearrin
916b7ee46b reenc keystore 2018-01-10 23:26:44 -05:00
Kyle Spearrin
bfe8ad2034 quiet output 2018-01-10 23:00:10 -05:00
Kyle Spearrin
bb9db7bf9d full android project path 2018-01-10 22:36:51 -05:00
Kyle Spearrin
d7f7c8c568 build script fixes 2018-01-10 22:30:30 -05:00
Kyle Spearrin
10839588dd Invoke-Expression 2018-01-10 22:20:22 -05:00
Kyle Spearrin
12cd2b67cd ci build apks script 2018-01-10 22:10:32 -05:00
Kyle Spearrin
9a13036f4e fdroid-build script 2018-01-10 18:32:57 -05:00
Kyle Spearrin
2f025d51ff remove rdp from appveyor 2018-01-10 18:01:48 -05:00
Kyle Spearrin
6cb6d3a358 run nuget restore 2018-01-10 17:19:56 -05:00
Kyle Spearrin
0bb01d14bd clean fdroid 2018-01-10 16:53:09 -05:00
Kyle Spearrin
2229c4e4d1 enable rdp for appveyor debugging 2018-01-10 16:37:05 -05:00
Kyle Spearrin
5c90c62378 msbuild android proj only 2018-01-10 16:10:47 -05:00
Kyle Spearrin
b7ed0a29fe clean with msbuild 2018-01-10 15:55:07 -05:00
Kyle Spearrin
796c2ed58c build solution again for fdroid 2018-01-10 15:40:17 -05:00
Kyle Spearrin
39bd573d9d backup original csproj files and clean bin folders 2018-01-10 15:26:27 -05:00
Kyle Spearrin
d4aaa547a7 remove libs for fdroid build 2018-01-10 14:55:18 -05:00
Kyle Spearrin
f7e2382847 AndroidApkSigningAlgorithm of SHA1withRSA 2018-01-10 13:38:08 -05:00
Kyle Spearrin
4bb16e7d93 version bump 2018-01-10 12:18:48 -05:00
Kyle Spearrin
e7e00e4ebf add target framework to PropertyGroup conditional 2018-01-10 11:52:53 -05:00
Kyle Spearrin
55d050fca7 fdroid artifacts for build 2018-01-10 09:35:47 -05:00
Kyle Spearrin
98d4fef0ee fdroid builds without Google and Hockey services 2018-01-10 09:28:30 -05:00
Kyle Spearrin
5521892736 secure note option handled 2018-01-10 08:47:20 -05:00
Kyle Spearrin
8f0fd0dfef F-Droid build configuration 2018-01-10 00:41:29 -05:00
Kyle Spearrin
514eab0b98 Merge branch 'master' of github.com:bitwarden/mobile 2018-01-09 11:31:14 -05:00
Kyle Spearrin
e35c84245d added org.mozilla.klar to whitelist 2018-01-09 11:31:00 -05:00
Kyle Spearrin
4a2391eb1b New Crowdin translations (#247)
* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (French)

* New translations AppResources.resx (German)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Estonian)
2018-01-08 21:19:45 -05:00
Kyle Spearrin
04eb497e10 version bump 2018-01-08 21:17:05 -05:00
Kyle Spearrin
a9a5da6dc6 update ffimageloading lib 2018-01-08 11:51:23 -05:00
Kyle Spearrin
3f1aab27d6 android back on main pages goes to vault first 2018-01-08 11:33:51 -05:00
Kyle Spearrin
8f77df4ebb Don't animate loading alert 2018-01-08 09:10:58 -05:00
Alistair Francis
65a8b3fcd4 UWP.Images: Reduce the size of the camera icon (#245)
Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-05 16:33:34 -05:00
Alistair Francis
71dd4e512e App: Pages: Add a null check in OnSelectTemplate() (#243)
To avoid accessing a null poiter add a null check in OnSelectTemplate().

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-04 23:33:10 -05:00
Alistair Francis
ca03a5ecf4 App: Controls: Improve the vault view images (#240)
* App: Controls: Improve the vault view images

Make the buttons smaller and ensure the background is transparent.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* UWP.Images: Use smaller size images

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* UWP.Images: Remove unused image

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-04 23:32:50 -05:00
Kyle Spearrin
694efb9508 unit FFImageLoading with fast renderer; TLS 1.2 2018-01-04 13:07:50 -05:00
Kyle Spearrin
c60a112039 update FFImageLoading and disable gifs on ios 2018-01-04 12:46:29 -05:00
Alistair Francis
c3570dd07a Improve the UWP toast notification colours (#239)
* UWP: Services: Improve the toast notifcation colours

This commit improves the toast notification colours and makes the
notification slightly transparent.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* UWP: Services: Remove the unused Alignment options

These Alignment options don't have an effect on UWP, so just remove
them.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2018-01-04 08:32:18 -05:00
Kyle Spearrin
b680b190d4 update app store screenshots 2018-01-03 17:07:47 -05:00
Kyle Spearrin
310d51d859 handle null conditions from action sheet 2018-01-03 17:07:33 -05:00
Kyle Spearrin
cf9e820227 version bump 2018-01-03 14:15:45 -05:00
Kyle Spearrin
b91d2f4fb1 always use CustomTableViewModelRenderer 2018-01-03 13:37:04 -05:00
Kyle Spearrin
9456f5dc31 redraw stack layouts on ios tableviews 2018-01-03 12:18:15 -05:00
Kyle Spearrin
fa9e22730a get rid of old refection and memory services 2018-01-02 16:41:06 -05:00
Kyle Spearrin
7261fd7ed9 version bump 2018-01-02 10:44:59 -05:00
Kyle Spearrin
ad9e5fbf07 appcompat fixes for android 4.4 2018-01-02 10:41:11 -05:00
Kyle Spearrin
c242117230 version bump 2018-01-01 09:17:25 -05:00
Kyle Spearrin
d7c1b23fa2 New Crowdin translations (#234)
* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Estonian)

* New translations copy.resx (Estonian)

* New translations copy.resx (Estonian)
2018-01-01 09:15:45 -05:00
Kyle Spearrin
25e9919bb3 new languages info 2017-12-30 21:48:32 -05:00
Kyle Spearrin
912c01457a New Crowdin translations (#233)
* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Norwegian Bokmal)

* New translations AppResources.resx (Norwegian Bokmal)

* New translations copy.resx (Estonian)

* New translations copy.resx (Estonian)

* New translations AppResources.resx (Estonian)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (German)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Norwegian Bokmal)
2017-12-30 21:34:14 -05:00
Kyle Spearrin
8083390eab style for ExtendedListView 2017-12-30 21:33:29 -05:00
Kyle Spearrin
44baa4cc1e fix compile error in renderer 2017-12-30 21:31:01 -05:00
Kyle Spearrin
f0662bb878 adjust bottom paddings on listviews/tableviews 2017-12-30 21:18:24 -05:00
Kyle Spearrin
fbe1a6d4c5 floating action button on android 2017-12-30 14:05:51 -05:00
Kyle Spearrin
2235f1f7af change dot to bullet 2017-12-30 12:02:51 -05:00
Kyle Spearrin
3f46f83ec8 reduce padding 2017-12-29 13:04:19 -05:00
Kyle Spearrin
d537d4a27e make cogs icon larger 2017-12-28 21:37:02 -05:00
Kyle Spearrin
c67250da2d base lock timer off of Stopwatch class 2017-12-28 21:14:30 -05:00
Kyle Spearrin
6027406eef cleanup old icons. make cogs larger 2017-12-28 17:42:29 -05:00
Kyle Spearrin
fdc51f33ad bottom navigation tab page on android 2017-12-28 17:31:44 -05:00
Kyle Spearrin
ea7290afab CheckForLockInBackground removed 2017-12-28 16:48:40 -05:00
Kyle Spearrin
be65597d57 detect TW language. resolves #228 2017-12-28 12:38:15 -05:00
Kyle Spearrin
253ed75800 lock not required during app ext setup 2017-12-27 23:50:35 -05:00
Kyle Spearrin
e4f3671ae0 no lock time updates from ios extension 2017-12-27 23:39:55 -05:00
Kyle Spearrin
c60cefd188 internal timer for lock checking 2017-12-27 22:18:11 -05:00
Kyle Spearrin
175a41f275 logic adjustments for first lock check 2017-12-27 17:05:33 -05:00
Kyle Spearrin
bd5fd72459 _firstLockCheck logic adjustments 2017-12-27 16:36:01 -05:00
Kyle Spearrin
98b70a647b resource fixes 2017-12-27 15:56:12 -05:00
Kyle Spearrin
3eee5e696d support for pr-BR 2017-12-27 15:42:46 -05:00
Kyle Spearrin
d92c6cc6c6 always locked if not running in memory 2017-12-27 15:39:51 -05:00
Kyle Spearrin
488485da54 New Crowdin translations (#230)
* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations copy.resx (Vietnamese)
2017-12-27 15:19:27 -05:00
Kyle Spearrin
a3f0254fb2 background timer for locking 2017-12-27 11:14:53 -05:00
Kyle Spearrin
ab5f1385c5 update to net471 2017-12-26 22:38:04 -05:00
Kyle Spearrin
cde5b09943 dismiss previous toasts on android 2017-12-23 23:48:47 -05:00
Kyle Spearrin
db42b6a3a5 null coalesce 2017-12-23 23:40:41 -05:00
Kyle Spearrin
ece35b96db dismiss previous toast & cleanup 2017-12-23 23:34:46 -05:00
Kyle Spearrin
c4c24ee240 toast layout updates 2017-12-23 23:22:47 -05:00
Kyle Spearrin
c7ba465970 TabBarVisible logic fix 2017-12-23 22:56:17 -05:00
Kyle Spearrin
937ad444da OK => Allow 2017-12-23 08:53:12 -05:00
Kyle Spearrin
0c0a928e87 adjust toast bottom margin depending on tab bar 2017-12-23 00:34:07 -05:00
Kyle Spearrin
2823a86b4e remove old grouping binding 2017-12-23 00:23:07 -05:00
Kyle Spearrin
1a06683611 fix arc remains in ios projects 2017-12-23 00:19:45 -05:00
Kyle Spearrin
50fa74adfe noop device action service 2017-12-23 00:10:48 -05:00
Kyle Spearrin
4ebd249356 user dialogs on UWP for loading 2017-12-23 00:04:52 -05:00
Kyle Spearrin
4dc388015c remove arc dialogs. create custom loading actions 2017-12-22 23:56:45 -05:00
Kyle Spearrin
0270cf6e45 convert user dialogs to native XF options 2017-12-22 22:41:48 -05:00
Kyle Spearrin
7a19c50ec0 autofill fixes 2017-12-22 18:34:46 -05:00
Kyle Spearrin
e2fc5fff23 Fixes for toast on iOS 2017-12-22 16:59:36 -05:00
Kyle Spearrin
839df123ff custom toast for ios 2017-12-22 16:18:16 -05:00
Kyle Spearrin
f897193f79 noop toast 2017-12-22 15:05:09 -05:00
Kyle Spearrin
9f23f4ead7 custom toast implementations 2017-12-22 15:00:11 -05:00
Kyle Spearrin
45ab6d47de upper section titles for autofill listing 2017-12-22 13:33:18 -05:00
Kyle Spearrin
35bc94f4bd revert uneven padding 2017-12-22 11:59:20 -05:00
Kyle Spearrin
94a4a38798 layout adjustments 2017-12-22 11:36:09 -05:00
Kyle Spearrin
7f431dbd01 Deprecate XF.Context and give context to renderers 2017-12-22 11:23:03 -05:00
Kyle Spearrin
d0257df134 custom thumb on slider for android 2017-12-22 09:30:30 -05:00
Alistair Francis
be3ed16d3c UWP: Generate UWP Assets (#220)
Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-22 00:14:44 -05:00
Kyle Spearrin
b651becf66 simplify push in UWP as well 2017-12-21 23:33:13 -05:00
Kyle Spearrin
bcf49ab396 cleanup and simplify ios push reg/handling 2017-12-21 23:26:46 -05:00
Kyle Spearrin
fb76ecf198 dont register on login anymore for android 2017-12-21 22:46:19 -05:00
Kyle Spearrin
1bed49b4c6 decrypt google-services.json for prod builds 2017-12-21 22:39:04 -05:00
Kyle Spearrin
c34376820a register android push on my vault page too 2017-12-21 22:28:09 -05:00
Kyle Spearrin
582e6ee322 switch from GCM to FCM 2017-12-21 22:28:09 -05:00
Kyle Spearrin
2b4ffaa357 add type to deviceinfo to avoid using XF 2017-12-21 22:28:09 -05:00
Kyle Spearrin
379a82972a null checks on appearing 2017-12-21 22:28:08 -05:00
Alistair Francis
713796a4f7 UWP: Fix images when compiling with .NET Native Toolchain (#219)
Following the instructions here:
https://github.com/luberda-molinet/FFImageLoading/wiki/Xamarin.Forms-API#windows-uwp---compile-with-net-native-tool-chain-note
fix the UWP App.xaml.cs to ensure images are loaded when building UWP
apps for release.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-21 08:55:24 -05:00
Kyle Spearrin
54161aaf39 list no folder items on my vault when no collects. 2017-12-20 13:55:59 -05:00
Kyle Spearrin
4054519f38 generated password color is black 2017-12-20 12:08:48 -05:00
Kyle Spearrin
e5d5d8b434 add autofill service support for web browsers 2017-12-20 11:55:16 -05:00
Kyle Spearrin
519fd212d9 fix cancel display logic 2017-12-20 10:30:57 -05:00
Kyle Spearrin
4b21660fd6 only show cancel when coming from another page 2017-12-20 10:22:39 -05:00
Kyle Spearrin
ac5c9e7242 combine password generator options 2017-12-20 09:55:19 -05:00
Kyle Spearrin
4c8431bd5b move password generator to main nav 2017-12-20 09:39:38 -05:00
Kyle Spearrin
a4a93f0999 remove my vault as default page options 2017-12-20 00:11:15 -05:00
Kyle Spearrin
b6a4efa7ba move favorites to top of grouping page 2017-12-19 23:59:12 -05:00
Kyle Spearrin
a4fbd521e3 device-type header on login 2017-12-18 13:58:36 -05:00
Kyle Spearrin
6fe5e89ecc position indicator when not UWP for spinner 2017-12-18 09:23:46 -05:00
Alistair Francis
bc40c95f20 Vault: Don't specify page options for ActivityLoading (#215)
When specifying page options the loader doesn't appear properly on UWP
applications. I also couldn't see the options documented here:
https://developer.xamarin.com/api/type/Xamarin.Forms.ActivityIndicator/

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-18 09:19:06 -05:00
Kyle Spearrin
acd35ac8a2 add net47 target framework 2017-12-18 09:18:16 -05:00
Alistair Francis
c9d9ec1c77 UWP.Images: Add the smile image (#213)
Somehow this was left out in the Windows Hello support commit
(f300d1bafd). Add it now.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-17 22:18:15 -05:00
Alistair Francis
08c4e2d465 UWP: Enable Collection Services (#214)
Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-17 22:17:53 -05:00
Alistair Francis
f300d1bafd Add support for Windows Hello (#212)
Windows Hello is currently supported in the UWP app, but all of the
strings just point to using fingerprint. Windows Hello instead will
adjust based on what the user has avaliable and registered with the
Windows OS. To reflect that it isn't just fingerprints update the
strings when on UWP.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-15 11:20:36 -05:00
Kyle Spearrin
d395115cc9 add support for Device-Type header 2017-12-15 09:48:25 -05:00
Kyle Spearrin
8571755daa netcoreapp20. path for publisher 2017-12-14 11:05:01 -05:00
Kyle Spearrin
9f3368ba1f convert publisher to netcoreapp 2017-12-14 10:54:51 -05:00
Kyle Spearrin
919df1edd5 remove old amazon resource 2017-12-14 10:21:12 -05:00
Kyle Spearrin
c180422e8b fixes for UWP 2017-12-14 10:19:50 -05:00
Kyle Spearrin
e90501a986 update hockeyapp 2017-12-14 10:02:59 -05:00
Kyle Spearrin
545af007b4 updating forms lib 2017-12-14 09:26:32 -05:00
Kyle Spearrin
e189ece487 update some packages 2017-12-13 23:59:45 -05:00
Kyle Spearrin
cebc2b5bdb Revert "update various packages"
This reverts commit c06df3889b.
2017-12-13 23:45:49 -05:00
Kyle Spearrin
444d48a259 Revert "Update to Forms 2.4"
This reverts commit 09ef1b66cc.
2017-12-13 23:30:43 -05:00
Kyle Spearrin
4fd70ad252 downgrade ios GA 2017-12-13 23:23:48 -05:00
Kyle Spearrin
293326b647 Revert "update image lib"
This reverts commit b071238eda.
2017-12-13 21:42:08 -05:00
Kyle Spearrin
b071238eda update image lib 2017-12-13 21:15:47 -05:00
Kyle Spearrin
09ef1b66cc Update to Forms 2.4 2017-12-13 21:04:51 -05:00
Kyle Spearrin
c06df3889b update various packages 2017-12-13 17:35:49 -05:00
Kyle Spearrin
280fc78f7e convert publisher to package ref 2017-12-13 17:20:24 -05:00
Kyle Spearrin
7b9fc04704 remove app config and consolidate packages 2017-12-13 17:14:54 -05:00
Kyle Spearrin
00e60f2592 not preview 2017-12-13 17:04:31 -05:00
Kyle Spearrin
45e9c762a7 update nuget 2017-12-13 16:59:14 -05:00
Kyle Spearrin
77dcb91741 try VS 2017 preview on appveyor 2017-12-13 16:47:05 -05:00
Kyle Spearrin
383c683716 update to netstandard2.0 and nuget ref packages
also removed old test projects no longer in use
2017-12-13 16:41:57 -05:00
Kyle Spearrin
ca3c380493 close folder page, not cancel 2017-12-13 10:37:18 -05:00
Kyle Spearrin
57ec5cb036 remove android 26 manual install for ci 2017-12-13 09:10:53 -05:00
Alistair Francis
177b48ac90 Add Windows support for QR code scanning (#207)
* UWP: Add support for QR code scanning

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* Pages: ScanPage: Set the close button on Windows

A previous commit mistakenly removed the close button, even though the
scan page is not modal. This means there is no way to navigate away if
running on Windows 10. Revert this change to add a back button.

We need to use a modal page here as we need it to pop up over the entire
view.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-13 08:57:49 -05:00
Alistair Francis
b4e7fd6fa8 Improve the navigation on Windows platforms (#199)
* App: Don't default to modal pushes on Windows

On Windows we generally want to avoid modal pushes as that doesn't give
us a back arrow on Windows 10. Default to non-modal pushes.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: LoginPage.cs: Don't add the cancel button on Windows

With Windows Phone having a HW back buton and the UWP toolbar now
supporting a back button we no longer need a cancel button.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* src: Set a icon for UWP cancel buttons

We can't always use modal pages and in that case we need to set a icon
for UWP otherwise the button can't be seen on the toolbar.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Don't add Cancel/Close button on Windows

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* Update DismissModalToolBarItem.cs
2017-12-12 16:03:25 -05:00
Alistair Francis
baf785d9f1 App: LoginPage.cs: Use a logo for the login button (#200)
* App: LoginPage.cs: Use a logo for the login button

This adds a helper function which we can use to set logos for Windows
platforms to ensure the user can see the UWP toolbar actions. This won't
have an effect on non-Windows platforms.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Set an icon for the save button on Windows

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Set an icon for submit, save and continue

Set an icon for the submit, save and continue buttons when running on
Windows platforms.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: Pages: Valut: Set an icon for the edit button

Set the cog icon for the edit button when running on Windows platforms.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-11 15:51:16 -05:00
Kyle Spearrin
25b75fd6e4 make sure PIN doesnt show on screen. adjust focus. 2017-12-11 14:29:50 -05:00
Kyle Spearrin
0c4c8534b4 target sdk 23 2017-12-11 11:38:43 -05:00
Kyle Spearrin
a559dbfe06 remove targetSdkVersion to fix webview jsbridge
ref https://github.com/xamarin/Xamarin.Forms/issues/1376
2017-12-11 11:11:36 -05:00
Alistair Francis
de20bb22d9 App: Use Windows helper instead of WinPhone (#203)
Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-10 23:26:58 -05:00
Kyle Spearrin
45c0ec9035 word wrap name cell 2017-12-08 09:03:44 -05:00
Kyle Spearrin
b16da90e42 disclosure update 2017-12-06 22:45:04 -05:00
Kyle Spearrin
ce7bcfa666 Merge branch 'master' of github.com:bitwarden/mobile 2017-12-06 11:31:54 -05:00
Kyle Spearrin
f6833699a6 null checks 2017-12-06 11:31:41 -05:00
Alistair Francis
040dc72877 Login page fixes (#193)
* App: LoginPage.cs: Correct the Windows device specifier

The WinPhone device specifier doesn't correctly take effect, use the
Windows decvice instead.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* App: LoginPage.cs: Fix the FormEntryCell imageSource

The images don't appear (at least on UWP) without the file extension.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-12-06 10:26:30 -05:00
Kyle Spearrin
056bce3dd9 New Crowdin translations (#197)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)
2017-12-06 09:23:35 -05:00
Kyle Spearrin
5d6575e97b version bump 2017-12-06 09:17:49 -05:00
Kyle Spearrin
f092d4ffc3 handle timers more appropriately 2017-12-05 13:58:09 -05:00
Kyle Spearrin
5bae15831b update fingerprint to beta4 2017-12-05 10:04:53 -05:00
Kyle Spearrin
cf19bd88f0 summary desc update for accessibility service 2017-12-04 08:19:22 -05:00
Kyle Spearrin
38ac6a1082 desc updates 2017-12-04 08:15:21 -05:00
Kyle Spearrin
b88e2bd3ce update desc copy 2017-12-03 22:09:24 -05:00
Kyle Spearrin
fad24c4308 autofill summary/desc updates 2017-12-03 22:00:14 -05:00
Kyle Spearrin
018fd83dba update to beta4 2017-12-02 20:33:42 -05:00
Kyle Spearrin
aa95da167f escape apostrophe 2017-12-02 06:27:40 -05:00
Kyle Spearrin
24e6a0be68 new summary/description for autofill service 2017-12-01 22:10:54 -05:00
Kyle Spearrin
a2c962c2f6 adjust faceid check logic 2017-11-29 23:29:13 -05:00
Kyle Spearrin
aa61331181 user dialogs removed from DI on auth service 2017-11-29 16:55:55 -05:00
Kyle Spearrin
00f0a7589c app missing ios extension services 2017-11-29 16:39:43 -05:00
Kyle Spearrin
d39609351a noop device action service for ios 2017-11-29 16:28:58 -05:00
Kyle Spearrin
6985ccf076 fix missing smile image refs 2017-11-29 16:11:07 -05:00
Kyle Spearrin
b448cad4de faceid support on extension lock page 2017-11-29 16:05:50 -05:00
Kyle Spearrin
14540b4cc0 support for faceid labels 2017-11-29 15:47:43 -05:00
Kyle Spearrin
898b76a549 thicker plus sign 2017-11-29 15:18:01 -05:00
Kyle Spearrin
5cf6e382d8 New Crowdin translations (#191)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations copy.resx (Turkish)

* New translations copy.resx (Turkish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (German)

* New translations copy.resx (Vietnamese)
2017-11-29 15:00:16 -05:00
Kyle Spearrin
e2ba56a227 images for autofill tools pages 2017-11-29 14:49:28 -05:00
Kyle Spearrin
ec9960e28e update fingerprint for UWP 2017-11-29 13:48:26 -05:00
Kyle Spearrin
dc59283160 resource designer update 2017-11-29 12:11:57 -05:00
Kyle Spearrin
d255d44be5 update fingerprint library 2017-11-29 11:51:07 -05:00
Kyle Spearrin
b2f68a5a7e search vault capitalized 2017-11-29 11:26:21 -05:00
Kyle Spearrin
ec32679ab1 change options autofill label to include accessib. 2017-11-29 11:18:33 -05:00
Kyle Spearrin
8b2471c128 rename features to options 2017-11-29 09:20:45 -05:00
Kyle Spearrin
022eba2c05 fixes for UWP 2017-11-28 21:27:57 -05:00
Kyle Spearrin
029c6fcfe3 Fix UWP errors 2017-11-28 21:08:45 -05:00
Kyle Spearrin
faaa0b2488 null check on field ctor 2017-11-28 13:39:31 -05:00
Kyle Spearrin
daa2ca876b update title of accessibility service page 2017-11-28 08:32:17 -05:00
Kyle Spearrin
81700cfb44 Revert "update fingerprint library"
This reverts commit b670280688.
2017-11-28 07:55:32 -05:00
Kyle Spearrin
6e58db95ed consistent font size 2017-11-27 23:01:01 -05:00
Kyle Spearrin
9b54862450 origin padding since it doesnt seem to work 2017-11-27 22:58:16 -05:00
Kyle Spearrin
f79efadd82 minimum padding for ios header 2017-11-27 22:53:01 -05:00
Kyle Spearrin
615a7670bd focus search after content results are set 2017-11-27 22:49:27 -05:00
Kyle Spearrin
155b8b472f back to old search icon 2017-11-27 22:44:51 -05:00
Kyle Spearrin
b35e3454f0 search updates 2017-11-27 22:39:28 -05:00
Kyle Spearrin
51b4716d45 ios buttons for list ciphers page 2017-11-27 22:34:42 -05:00
Kyle Spearrin
b62803a03a group is case insensitive 2017-11-27 22:25:51 -05:00
Kyle Spearrin
616893955f 0-9 is now # 2017-11-27 22:16:06 -05:00
Kyle Spearrin
0f387a139b set color of listview table index 2017-11-27 22:14:13 -05:00
Kyle Spearrin
219c81aac5 header adjustments 2017-11-27 22:09:00 -05:00
Kyle Spearrin
083003d34f empty string header for iOS 2017-11-27 21:58:52 -05:00
Kyle Spearrin
699f76c29e revert endpoint change 2017-11-27 21:58:32 -05:00
Kyle Spearrin
b670280688 update fingerprint library 2017-11-27 20:53:43 -05:00
Kyle Spearrin
37ea84ffe9 rename autofill pages 2017-11-27 20:45:09 -05:00
Kyle Spearrin
40b861acbe autofill service tools page labels 2017-11-27 19:23:26 -05:00
Kyle Spearrin
783c4d104c add tools page for autofill service 2017-11-27 17:27:11 -05:00
Kyle Spearrin
9bbddd6aeb show loading indicator if syncing an no items 2017-11-27 15:42:36 -05:00
Kyle Spearrin
e753acbc3f clear cache on logout 2017-11-27 15:11:06 -05:00
Kyle Spearrin
92b7b1d603 handle conditions when no data 2017-11-27 15:05:12 -05:00
Kyle Spearrin
b07dc8443e default to "My Vault" option 2017-11-27 14:41:15 -05:00
Kyle Spearrin
3f99c513f3 rename pages 2017-11-27 14:26:07 -05:00
Kyle Spearrin
793241523d Rename pages 2017-11-27 14:24:47 -05:00
Kyle Spearrin
7cff22fb9e cleanup old list page 2017-11-27 14:23:42 -05:00
Kyle Spearrin
214f308027 Revert "disable fingerprint test"
This reverts commit c1ce971adb.
2017-11-27 13:56:11 -05:00
Kyle Spearrin
c1ce971adb disable fingerprint test 2017-11-27 13:25:19 -05:00
Kyle Spearrin
f5896be699 add uri and add buttons of search page 2017-11-27 13:22:42 -05:00
Kyle Spearrin
186f839569 exclude search fields from password filter 2017-11-27 11:54:31 -05:00
Kyle Spearrin
4879d906d9 filtered results for groupings and favorites 2017-11-27 09:47:49 -05:00
Kyle Spearrin
09412f0b78 no upper on autofill section headers 2017-11-25 23:33:50 -05:00
Kyle Spearrin
2f2d85576f consolidating section header models 2017-11-25 23:32:20 -05:00
Kyle Spearrin
362ddd0339 centralize some helpers 2017-11-25 23:04:14 -05:00
Kyle Spearrin
9499b7f562 search page with name groups 2017-11-25 15:43:43 -05:00
Kyle Spearrin
d8bb12b5f1 folder_o for "No Folder" 2017-11-25 14:06:44 -05:00
Kyle Spearrin
5d464f4477 increment index alter comparison, resolves #185 2017-11-25 13:49:54 -05:00
Kyle Spearrin
aaea0b2659 vault list grouping page 2017-11-24 23:15:25 -05:00
Kyle Spearrin
c9ceb09906 add collection syncing 2017-11-24 16:11:40 -05:00
Kyle Spearrin
3b44ede67e refactor message center use to services 2017-11-21 23:08:45 -05:00
Kyle Spearrin
b48e8eeb0e set notification channel to low priority 2017-11-21 17:52:23 -05:00
Kyle Spearrin
1fafc29ec3 remove unsubs 2017-11-21 14:31:46 -05:00
Kyle Spearrin
1a9d0576c8 cleanup subscriptions when autofilling 2017-11-21 13:28:02 -05:00
Kyle Spearrin
bc04211b79 autofill from vault with specified dataset 2017-11-21 11:29:00 -05:00
Kyle Spearrin
cfe34355bd helper for empty header value 2017-11-20 22:39:49 -05:00
Kyle Spearrin
e3e833d8c0 no savetype var 2017-11-20 22:39:33 -05:00
Kyle Spearrin
5606a0a968 fix test 2017-11-20 16:32:23 -05:00
Kyle Spearrin
f0358f1da8 run android script from web download 2017-11-20 16:25:02 -05:00
Kyle Spearrin
a3129e9e17 install android before_build 2017-11-20 16:20:24 -05:00
Kyle Spearrin
7435ede254 install android 26 2017-11-20 16:17:28 -05:00
Kyle Spearrin
84e79e92b4 add other items to autofill from app page 2017-11-20 16:07:33 -05:00
Kyle Spearrin
6268130998 add rdp info to build 2017-11-20 10:41:11 -05:00
Kyle Spearrin
7ad639599a added slash to folder route 2017-11-20 07:32:58 -05:00
Kyle Spearrin
caff67b77d added cards and other improvements to save 2017-11-18 23:04:21 -05:00
Kyle Spearrin
c45a77d538 add support for card filling 2017-11-18 15:09:09 -05:00
Kyle Spearrin
4b24fe1bf4 dont reset main page for autofill framework 2017-11-17 23:46:45 -05:00
Kyle Spearrin
73e5fb6314 FillableForLogin check last 2017-11-17 23:41:53 -05:00
Kyle Spearrin
84ea28adfa added hint detection to username/password fields 2017-11-17 23:38:09 -05:00
Kyle Spearrin
955fc97cb2 ignoreids 2017-11-17 23:26:51 -05:00
Kyle Spearrin
e4012e4f87 autofill cleanup 2017-11-17 23:00:57 -05:00
Kyle Spearrin
2c662c428c better detection for username/passwords 2017-11-17 22:47:08 -05:00
Kyle Spearrin
da199deed1 only show autofills if a fillable login form 2017-11-17 17:46:55 -05:00
Kyle Spearrin
abf75cffd9 parse saved item info for save 2017-11-17 17:15:42 -05:00
Kyle Spearrin
184f13b148 save info from service to add cipher page 2017-11-17 14:38:56 -05:00
Kyle Spearrin
d1c7309b29 search goes to vault apge, not main page 2017-11-17 13:03:43 -05:00
Kyle Spearrin
62db6552d2 no androidapp://android package 2017-11-17 10:18:18 -05:00
Kyle Spearrin
a019b9e1d3 dont set uri if null 2017-11-17 10:09:27 -05:00
Kyle Spearrin
cb22572f2b dont offer autofill in bitwarden app 2017-11-17 10:05:13 -05:00
Kyle Spearrin
b52134e9ee cancel on lock page back button 2017-11-17 10:03:41 -05:00
Kyle Spearrin
44ef82219b flags 2017-11-17 09:52:14 -05:00
Kyle Spearrin
8c89b0e587 switch to main activity when locked 2017-11-17 09:21:12 -05:00
Kyle Spearrin
322b251def auth activity for locked vaults when autofilling 2017-11-17 00:16:45 -05:00
Kyle Spearrin
0a6767209d layout updates 2017-11-16 22:34:19 -05:00
Kyle Spearrin
1694b5d6fd renaming things 2017-11-16 21:58:04 -05:00
Kyle Spearrin
0dd9ad43e8 clear cache 2017-11-16 17:18:25 -05:00
Kyle Spearrin
c1ae3f1fb2 cache ciphers 2017-11-16 16:51:43 -05:00
Kyle Spearrin
d84627aa2c better detection based on IdEntry sniffing 2017-11-16 16:09:57 -05:00
Kyle Spearrin
0e020924ff refactor autofill classes. basic login support. 2017-11-14 23:13:55 -05:00
Kyle Spearrin
4f5e238685 build out supporting classes from old refs 2017-11-14 16:46:40 -05:00
Kyle Spearrin
72ff680114 remove hacks 2017-11-14 16:38:05 -05:00
Kyle Spearrin
849ec6fa8f add old autofill implementation for reference. 2017-11-14 16:31:03 -05:00
Kyle Spearrin
36ee3aaec6 Revert "use vs 2017 preview"
This reverts commit 497d4f50dd.
2017-11-14 16:21:55 -05:00
Kyle Spearrin
497d4f50dd use vs 2017 preview 2017-11-14 16:03:44 -05:00
Kyle Spearrin
74a40b2274 stub out autofill framework service 2017-11-14 16:00:32 -05:00
Alistair Francis
75e85541a6 UWP/Assets: Update to use the Bitwarden logo (#169)
* UWP/Assets: Update to use the Bitwarden logo

Signed-off-by: Alistair Francis <alistair@alistair23.me>

* Package.appxmanifest: Show title on UWP tiles

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-11-13 07:48:45 -05:00
Alistair Francis
1d8fbac796 TokenService.cs: Check if key exists before deleting it (#168)
To avoid errors in Task<ApiResult<TokenResponse>> when logging in on
UWP apps ensure that we check that they key exists before we delete the
2FA key token.

Signed-off-by: Alistair Francis <alistair@alistair23.me>
2017-11-13 07:47:57 -05:00
Kyle Spearrin
daf6d1936f remove old keystore storage service 2017-11-10 16:49:13 -05:00
Kyle Spearrin
1768e8cb62 test 2017-11-09 23:07:13 -05:00
Kyle Spearrin
d2d6bfc065 dont export PackageReplacedReceiver 2017-11-09 20:33:01 -05:00
Kyle Spearrin
d4f6e9c587 no max lines on android labels 2017-11-03 17:22:53 -04:00
Kyle Spearrin
6d06f2212e version bump 2017-11-03 17:07:20 -04:00
Kyle Spearrin
73b310d59e fixes for extension add login 2017-11-03 16:58:04 -04:00
Kyle Spearrin
3dc705a7a9 only sync if not updated 2017-11-01 20:33:05 -04:00
Kyle Spearrin
8fc8d03cc4 version bump 2017-11-01 14:41:16 -04:00
Kyle Spearrin
df77f42145 remove FilterTouchesWhenObscured for now 2017-11-01 11:19:57 -04:00
Kyle Spearrin
0dea5bdbea remove amazon store assets 2017-10-30 16:51:23 -04:00
Kyle Spearrin
5c7f939440 Update README.md 2017-10-30 16:48:45 -04:00
Kyle Spearrin
09bef28362 remove .png from selected icon 2017-10-30 15:18:24 -04:00
Kyle Spearrin
1f0f94746b only show icons in nav 2017-10-30 14:13:09 -04:00
Kyle Spearrin
c057be17d0 bump bundle version for ios 2017-10-30 12:51:36 -04:00
Kyle Spearrin
301aaf9c68 version bump on iOS and new lang codes 2017-10-30 11:23:19 -04:00
Kyle Spearrin
ab7093f962 New Crowdin translations (#154)
* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (French)
2017-10-30 11:18:25 -04:00
Kyle Spearrin
29b2d67fb6 null checks 2017-10-30 11:12:14 -04:00
Kyle Spearrin
d4cd2b8be8 perform sync on update 2017-10-28 21:36:27 -04:00
Kyle Spearrin
fea94f956d version bump for beta 2017-10-27 11:32:38 -04:00
Kyle Spearrin
a656aa21f8 more icons resized on android 2017-10-27 11:23:29 -04:00
Kyle Spearrin
3b235f2ca2 Update README.md 2017-10-26 11:54:09 -04:00
Kyle Spearrin
376841f619 New Crowdin translations (#152)
* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations AppResources.resx (Danish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (German)

* New translations copy.resx (German)

* New translations copy.resx (German)

* New translations AppResources.resx (German)

* New translations AppResources.resx (French)
2017-10-26 09:40:34 -04:00
Kyle Spearrin
746a7c404b set custom icons server url 2017-10-23 23:20:35 -04:00
Kyle Spearrin
2d126300d8 set placeholder first 2017-10-23 13:08:46 -04:00
Kyle Spearrin
ed7e43ed6e downgrade cachedimage lib 2017-10-21 00:05:59 -04:00
Kyle Spearrin
7c56f1a773 bind to image with OnBindingContextChanged 2017-10-20 23:08:39 -04:00
Kyle Spearrin
6ba396440f cipher renames 2017-10-20 16:57:48 -04:00
Kyle Spearrin
8970525861 Fix cipher changes in extension model 2017-10-20 16:56:10 -04:00
Kyle Spearrin
5a88a66709 next return if nextelement set later 2017-10-20 16:51:30 -04:00
Kyle Spearrin
3ae6e3ee53 icons for uwp 2017-10-20 16:33:12 -04:00
Kyle Spearrin
5c0d4700f9 new icons for ios 2017-10-20 16:32:08 -04:00
Kyle Spearrin
7b354f5b8c update folder size to 20 2017-10-20 16:28:55 -04:00
Kyle Spearrin
a197c0219e hostnameUri fix 2017-10-20 16:18:30 -04:00
Kyle Spearrin
05f4036309 disable website icons option 2017-10-20 16:10:22 -04:00
Kyle Spearrin
37974c7ec8 icons in vault listing 2017-10-20 15:24:40 -04:00
Kyle Spearrin
5cb3e15201 update more icon for android styling 2017-10-20 13:03:04 -04:00
Kyle Spearrin
54b4766680 optimizations for secure notes 2017-10-20 12:51:41 -04:00
Kyle Spearrin
cc0bb65096 subtitles for each type 2017-10-20 12:47:05 -04:00
Kyle Spearrin
296c9dc055 cipher edit for various types 2017-10-20 12:35:31 -04:00
Kyle Spearrin
70aa2309b7 added support for cards and identity to view page 2017-10-20 11:25:34 -04:00
Kyle Spearrin
d2468d144e more renames 2017-10-19 16:08:29 -04:00
Kyle Spearrin
ebbe704672 replace launch and clipboard buttons with icons 2017-10-19 14:56:11 -04:00
Kyle Spearrin
d146870a74 rename pages and props for login => cipher 2017-10-19 14:30:12 -04:00
Kyle Spearrin
58ebabf74c fix add class refs 2017-10-19 13:49:15 -04:00
Kyle Spearrin
8f8a3b6387 rename page to addcipher 2017-10-19 13:46:12 -04:00
Kyle Spearrin
df616cfe3e add ciphers: card, identity, and sec note 2017-10-19 13:44:05 -04:00
Kyle Spearrin
dd96608bb1 splash is exportable 2017-10-19 11:19:24 -04:00
Kyle Spearrin
264f2ab316 restore api endpoints 2017-10-19 11:19:10 -04:00
Kyle Spearrin
773f156785 change home settings to extendedbutton 2017-10-19 08:55:18 -04:00
Kyle Spearrin
7cd3e2a5b9 do not export bitwarden activities 2017-10-19 08:53:30 -04:00
Kyle Spearrin
0ec22a4639 update resource strings for Logins => Items 2017-10-18 21:53:44 -04:00
Kyle Spearrin
74ac9cbbbe add other cipher type support to vault listings 2017-10-18 21:35:33 -04:00
Kyle Spearrin
0020bd0fb7 some remaining login => renames 2017-10-18 21:07:30 -04:00
Kyle Spearrin
1d6ec0f953 refactoring code for login => cipher support 2017-10-18 20:55:33 -04:00
Kyle Spearrin
37f05f0a12 Changed "Cancel" to "Close" 2017-10-13 09:11:37 -04:00
Kyle Spearrin
9a22a1dbf4 add autofill support for edge browser 2017-10-12 22:53:41 -04:00
Kyle Spearrin
b768c8b28a proper push service 2017-10-10 11:49:56 -04:00
Kyle Spearrin
bcbdbb4932 cleanup push 2017-10-10 10:55:54 -04:00
Kyle Spearrin
04e42c4a75 UNUserNotificationCenterDelegate 2017-10-10 09:13:09 -04:00
Kyle Spearrin
6040c7768f rename to pushnotificationservice 2017-10-10 08:26:17 -04:00
Kyle Spearrin
6da0d3e88d push for uwp 2017-10-09 23:53:06 -04:00
Kyle Spearrin
7c6cc7b246 local push notification implementation from lib 2017-10-09 23:45:23 -04:00
Kyle Spearrin
d5da1d6f3f all architectures 2017-10-08 21:36:27 -04:00
Kyle Spearrin
de5ee90e21 C2D_MESSAGE protectionLevel signature 2017-10-07 12:57:52 -04:00
Kyle Spearrin
8a0c9ab3db add back slash prefix to api routes 2017-10-03 23:56:10 -04:00
Kyle Spearrin
e901a1f231 UWP tabbed page with icons 2017-10-03 12:11:09 -04:00
Kyle Spearrin
e4c47aca9e shorthand 2017-10-02 22:38:56 -04:00
Kyle Spearrin
a43a3db098 formatting updates 2017-10-02 22:38:10 -04:00
Hicham Boushaba
d651606800 Add UWP support (#139)
* Add UWP project, and generate services boilerplate

* SqliteService implementation and sqlite-net-pcl update (#bug https://stackoverflow.com/questions/45418669/xamarin-forms-pcl-assemly-issue)

* Important services implementation

* Create a shared project to host images for UWP (to keep code project clean)

* Add extensions to image names referenced by the pcl project

* Add DismissModalToolBarItem to modal pages

* moving UWP folders inside src folder

* Add DeviceInfoService implementation

* Remove dependency on BouncyCastle, and calculate key derivation using native support

* changes requested by project maintener

* Fix HasCamera property

* DeviceActionService implementation
2017-10-02 22:15:13 -04:00
Kyle Spearrin
5501ab9083 bump build 2017-09-29 17:42:11 -04:00
Kyle Spearrin
660a21deb1 info.plist updates 2017-09-29 17:22:52 -04:00
Kyle Spearrin
be7949b909 remove old icons 2017-09-29 17:15:16 -04:00
Kyle Spearrin
a688656f6d asset catalog with app icons 2017-09-29 17:14:52 -04:00
Kyle Spearrin
62365529cc Revert "asset catalog with app icon for itunes"
This reverts commit dcea869098.
2017-09-29 17:10:12 -04:00
Kyle Spearrin
dcea869098 asset catalog with app icon for itunes 2017-09-29 16:29:29 -04:00
Kyle Spearrin
634a8702cd autofill adjustments 2017-09-29 15:12:33 -04:00
Kyle Spearrin
fee993c309 new review link for ios 11 2017-09-28 23:26:59 -04:00
Kyle Spearrin
bf76707e92 shorthand null check 2017-09-28 22:56:36 -04:00
Kyle Spearrin
da847f6567 ios extension autofill fixes 2017-09-28 22:54:46 -04:00
Kyle Spearrin
7a5d25f2e3 version bump 2017-09-28 16:54:51 -04:00
Kyle Spearrin
bf0dedd447 new languages 2017-09-27 23:26:03 -04:00
Kyle Spearrin
3f7dcc6acf New Crowdin translations (#138)
* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Danish)

* New translations copy.resx (Vietnamese)

* New translations copy.resx (Vietnamese)

* New translations copy.resx (Vietnamese)

* New translations AppResources.resx (Vietnamese)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Thai)

* New translations AppResources.resx (Turkish)

* New translations AppResources.resx (Dutch)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Chinese Simplified)
2017-09-27 23:17:34 -04:00
Kyle Spearrin
2efe8b4186 switch back to bearer 2017-09-27 23:06:41 -04:00
Kyle Spearrin
068f5771b2 make notes editor taller 2017-09-27 14:36:55 -04:00
Kyle Spearrin
c2b1be288e remove MovementMethod to enable highlight 2017-09-27 14:36:42 -04:00
Kyle Spearrin
163ad248af autofill custom fields for iOS extension 2017-09-26 14:38:12 -04:00
Kyle Spearrin
4598c3d852 resources for test project 2017-09-26 12:42:50 -04:00
Kyle Spearrin
a1dec131c7 dont automatically use latest target framework 2017-09-26 12:20:20 -04:00
Kyle Spearrin
133585f46a revert to 7.1 2017-09-26 11:57:49 -04:00
Kyle Spearrin
3ea81ce2fb reveal hidden value for custom fields 2017-09-26 11:06:50 -04:00
Kyle Spearrin
590fe211c4 edit custom fields 2017-09-25 17:13:20 -04:00
Kyle Spearrin
78cda03d61 cleanup login view of custom fields. 2017-09-25 15:05:36 -04:00
Kyle Spearrin
e126cbf644 sync and display custom fields for login 2017-09-22 17:32:20 -04:00
Kyle Spearrin
cc12ae7712 sub-classed login props for cipher req 2017-09-21 10:50:15 -04:00
Kyle Spearrin
e8486abccf change login to cipher apis 2017-09-20 17:37:09 -04:00
Kyle Spearrin
15f074a45b remove duplicate / from API routes 2017-09-20 13:23:47 -04:00
Kyle Spearrin
a426d98e92 change syncing to use new sync api 2017-09-20 13:17:05 -04:00
Kyle Spearrin
45d171e0e3 notes keyboard type is "Text" for auto-cap 2017-09-19 16:34:29 -04:00
Kyle Spearrin
5950c33a43 qs tile to quickly launch my vault (android) 2017-09-19 15:55:15 -04:00
Kyle Spearrin
ea1b584436 fixes for mobile app uris 2017-09-15 08:12:24 -04:00
Kyle Spearrin
a24ede364d switch all monospaced fonts on iOS to menlo 2017-09-14 15:17:28 -04:00
Kyle Spearrin
c6fe456cac more terms to ignore from package names 2017-09-12 17:18:59 -04:00
Kyle Spearrin
4008fb3a53 search packagename terms on android autofill 2017-09-12 17:01:13 -04:00
Kyle Spearrin
96588089ef filter out "launcher" apps from autofill service 2017-09-12 15:54:08 -04:00
Kyle Spearrin
e4c96dc6d8 all editor to be scrollable 2017-09-12 15:41:18 -04:00
Kyle Spearrin
c205e0da1b add icon to hockeyapp activity modification 2017-09-12 14:57:19 -04:00
Kyle Spearrin
7b61605834 version bump 2017-09-12 10:13:00 -04:00
Kyle Spearrin
e7fb05d7e0 update info.plist language resource array 2017-09-12 10:11:30 -04:00
Kyle Spearrin
8f0680f5fc new language resource files 2017-09-12 10:08:32 -04:00
Kyle Spearrin
9c03dd001c New Crowdin translations (#129)
* New translations AppResources.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Polish)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Turkish)

* New translations AppResources.resx (Turkish)

* New translations copy.resx (Turkish)

* New translations copy.resx (Turkish)

* New translations copy.resx (Ukrainian)

* New translations copy.resx (Ukrainian)

* New translations copy.resx (Ukrainian)

* New translations AppResources.resx (Ukrainian)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Czech)

* New translations AppResources.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Dutch)

* New translations copy.resx (Dutch)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Croatian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Hungarian)

* New translations copy.resx (Hungarian)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Hungarian)

* New translations AppResources.resx (Chinese Simplified)
2017-09-12 09:09:00 -04:00
Kyle Spearrin
30407f5b4e handle iOS apps that don't specify a url properly 2017-09-09 13:41:10 -04:00
Kyle Spearrin
3a5378d201 do not attempt autofill on android 4.4 2017-09-08 09:16:21 -04:00
Kyle Spearrin
d4f3577f5e use latest VS image 2017-09-07 00:34:51 -04:00
Kyle Spearrin
408e9bf3fc conditionals if device has camera or not 2017-09-07 00:33:19 -04:00
Kyle Spearrin
f5dd91afe5 parse IP addresses as base domains 2017-09-06 23:08:24 -04:00
Kyle Spearrin
8922459418 mark hockeyapp UpdateActivity as exported=false 2017-09-04 23:34:30 -04:00
Kyle Spearrin
caeadbc41e version bump for ios 2017-08-31 21:13:25 -04:00
Kyle Spearrin
99143c0e3b Update appveyor.yml 2017-08-31 08:17:55 -04:00
Kyle Spearrin
1b145e38a3 version bump 2017-08-30 22:43:19 -04:00
Kyle Spearrin
f59cce15c0 move delay after 2017-08-30 22:21:56 -04:00
Kyle Spearrin
7655c251a2 re-try focus on password lock page 2017-08-30 22:19:14 -04:00
Kyle Spearrin
5608cb542f update pinvoke libs 2017-08-30 22:15:30 -04:00
Kyle Spearrin
62add53c08 clear org key cache 2017-08-30 22:15:10 -04:00
Kyle Spearrin
43bae6c05b use bearer3 still for now 2017-08-30 14:23:07 -04:00
Kyle Spearrin
55777d33ad pl language 2017-08-30 10:14:20 -04:00
Kyle Spearrin
0f5d14b589 New Crowdin translations (#124)
* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Polish)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Japanese)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Russian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hindi)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Chinese Simplified)
2017-08-30 08:53:59 -04:00
Kyle Spearrin
00703d1570 setting with custom defaultsName 2017-08-29 16:58:02 -04:00
Kyle Spearrin
fd03c33f4d update xam forms lib 2017-08-29 16:21:32 -04:00
Kyle Spearrin
c20f91b6d8 update libs 2017-08-29 16:11:12 -04:00
Kyle Spearrin
10b22e9e42 update and refactor for settings changes 2017-08-29 16:03:26 -04:00
Kyle Spearrin
329f0871d5 cleanup and update sqlite packages 2017-08-29 15:38:22 -04:00
Kyle Spearrin
66996f491c retry focus until it works on pin lock page 2017-08-29 15:25:16 -04:00
Kyle Spearrin
9ae39f3900 visible w/ no suggestions for password entries 2017-08-29 15:05:56 -04:00
Kyle Spearrin
9d0db3c1e5 remove setting soft input mode 2017-08-29 14:33:25 -04:00
Kyle Spearrin
5932dd99ad remove to web vault url 2017-08-28 18:08:26 -04:00
Kyle Spearrin
910f0083cd allow setting vault url for environment 2017-08-28 17:50:17 -04:00
Kyle Spearrin
32a8676572 wrap username and password at full font size 2017-08-28 17:46:28 -04:00
Kyle Spearrin
801829ccbf update packages for nsub in test 2017-08-23 11:54:18 -04:00
Kyle Spearrin
b5107d21dd set custom environment urls from home page 2017-08-23 11:40:40 -04:00
Kyle Spearrin
158bf873bd return from autofill events when device is asleep 2017-08-15 12:28:48 -04:00
Kyle Spearrin
40cfb9876d properly background unregister call 2017-08-11 14:24:44 -04:00
Kyle Spearrin
12e3214f70 handle non-root URLs 2017-08-11 14:24:32 -04:00
Kyle Spearrin
0eb68ec461 revert old bearer code. use bearer scheme again 2017-08-10 10:16:58 -04:00
Kyle Spearrin
f231565163 delay credential clear when no passwords 2017-08-09 21:40:59 -04:00
Kyle Spearrin
7cca53bcc5 vault is default page when searching from autofill 2017-08-01 22:11:00 -04:00
Kyle Spearrin
be94c94309 comment out test code 2017-07-31 12:34:19 -04:00
Kyle Spearrin
8e2d654b40 fix url if malformed 2017-07-31 12:30:05 -04:00
Kyle Spearrin
2ed5c0c5cc add lightning & focus browser support for autofill 2017-07-31 11:30:07 -04:00
Kyle Spearrin
745ad3b9e9 better null checks for tokens 2017-07-31 10:23:52 -04:00
Kyle Spearrin
3ce114760f New Crowdin translations (#111)
* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Polish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hindi)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (French)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Chinese Simplified)
2017-07-31 10:05:43 -04:00
Kyle Spearrin
bae7d1fc1d version bump for android 2017-07-28 17:27:24 -04:00
Kyle Spearrin
e4d9dfc128 added broadcast receiver for when android updated 2017-07-28 17:21:39 -04:00
Kyle Spearrin
7490ba3179 copy update for itunes store, remove "free" 2017-07-26 22:05:26 -04:00
Kyle Spearrin
45da12ad55 catch exception when cannot create temp cam file 2017-07-26 16:19:58 -04:00
Kyle Spearrin
75f99bf899 Merge branch 'master' of github.com:bitwarden/mobile 2017-07-26 14:46:06 -04:00
Kyle Spearrin
bd2b1cc166 New Crowdin translations (#106)
* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Chinese Simplified)
2017-07-26 14:44:46 -04:00
Kyle Spearrin
5fa8d64994 fix preview identity url 2017-07-26 10:48:04 -04:00
Kyle Spearrin
034957b556 version bump 2017-07-25 22:25:13 -04:00
Kyle Spearrin
a9d7c73b04 Revert "remove --nodevcodeshare"
This reverts commit b68a94c0e5.
2017-07-25 16:33:11 -04:00
Kyle Spearrin
b09fe05fe6 Revert "added forms reference to extension"
This reverts commit f239868299.
2017-07-25 16:32:52 -04:00
Kyle Spearrin
ed146549ef Revert "dialogs package installed to extension"
This reverts commit 83047558d5.
2017-07-25 16:32:40 -04:00
Kyle Spearrin
86c11db1a1 Revert "added push package to extension"
This reverts commit 5969e2d7ed.
2017-07-25 16:32:31 -04:00
Kyle Spearrin
580cd57433 Revert "added ffimage lib to extension"
This reverts commit de46c9ee36.
2017-07-25 16:32:23 -04:00
Kyle Spearrin
9854ce82bd Revert "zxing lib to extension"
This reverts commit f8bd7c2e64.
2017-07-25 16:32:15 -04:00
Kyle Spearrin
af11df97f5 Revert "update build package"
This reverts commit ef7fa5363a.
2017-07-25 16:32:07 -04:00
Kyle Spearrin
9b4e664908 Revert "--nodevcodeshare"
This reverts commit 567e1ee116.
2017-07-25 16:31:58 -04:00
Kyle Spearrin
567e1ee116 --nodevcodeshare 2017-07-25 12:30:20 -04:00
Kyle Spearrin
ef7fa5363a update build package 2017-07-25 11:16:47 -04:00
Kyle Spearrin
f8bd7c2e64 zxing lib to extension 2017-07-25 11:08:31 -04:00
Kyle Spearrin
de46c9ee36 added ffimage lib to extension 2017-07-25 11:01:19 -04:00
Kyle Spearrin
5969e2d7ed added push package to extension 2017-07-25 10:55:26 -04:00
Kyle Spearrin
83047558d5 dialogs package installed to extension 2017-07-25 10:48:07 -04:00
Kyle Spearrin
f239868299 added forms reference to extension 2017-07-25 10:40:15 -04:00
Kyle Spearrin
e4b962a3a6 update launch screen 2017-07-25 10:37:48 -04:00
Kyle Spearrin
b68a94c0e5 remove --nodevcodeshare 2017-07-25 10:37:39 -04:00
Kyle Spearrin
ec53ca8423 missing ioc registration 2017-07-25 09:52:07 -04:00
Kyle Spearrin
1ba0729e34 cleanup 2017-07-25 08:51:55 -04:00
Kyle Spearrin
73425c0052 debug check on screenshot protection 2017-07-24 15:04:31 -04:00
Kyle Spearrin
679859fb37 stop timer when page disappears. autofocus camera. 2017-07-24 12:33:07 -04:00
Kyle Spearrin
dbdc660464 properly init events when provider changes 2017-07-24 12:33:07 -04:00
Kyle Spearrin
aa22e7e952 New Crowdin translations (#105)
* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Chinese Simplified)
2017-07-24 10:55:52 -04:00
Kyle Spearrin
b920e7e95c attachment updates 2017-07-24 10:34:22 -04:00
Kyle Spearrin
d14b23ca82 null check for mac 2017-07-23 00:10:32 -04:00
Kyle Spearrin
4e8f69f692 paperclip icon for attachments in listing 2017-07-23 00:09:24 -04:00
Kyle Spearrin
c96cf2b0e5 update samsung browser url view id 2017-07-22 23:31:38 -04:00
Kyle Spearrin
4921cfb593 mac is optional 2017-07-22 23:22:21 -04:00
Kyle Spearrin
395545f7b1 Add support for camera for android choose file 2017-07-22 21:06:53 -04:00
Kyle Spearrin
f9d336a3a6 attachments page with upload/delete 2017-07-22 15:38:08 -04:00
Kyle Spearrin
b32603b472 premium required for attachment download 2017-07-21 17:21:04 -04:00
Kyle Spearrin
1124c48c8d copy totp code on autofill 2017-07-21 11:39:22 -04:00
Kyle Spearrin
98e429505c get file data from document picker 2017-07-15 10:08:19 -04:00
Kyle Spearrin
d0b616ba24 select file for document picker 2017-07-15 01:09:30 -04:00
Kyle Spearrin
dac4ffcb98 new languages 2017-07-15 01:09:30 -04:00
Kyle Spearrin
680310cf70 New Crowdin translations (#103)
* New translations AppResources.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Romanian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Croatian)

* New translations copy.resx (Croatian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Czech)

* New translations copy.resx (Croatian)

* New translations AppResources.resx (Croatian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (French)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Chinese Simplified)
2017-07-14 16:08:26 -04:00
Kyle Spearrin
67ff82810f min width on file size 2017-07-13 18:08:16 -04:00
Kyle Spearrin
87e71ea860 QR code scanning for authenticator keys 2017-07-13 17:23:18 -04:00
Kyle Spearrin
26c110291e totp code generation on view login 2017-07-13 14:44:02 -04:00
Kyle Spearrin
9879f074b4 decrypt with org id 2017-07-13 12:08:48 -04:00
Kyle Spearrin
65168c71c0 add/edit login totp key 2017-07-13 11:52:24 -04:00
Kyle Spearrin
4c4996ee2a dont add empty note section first 2017-07-13 11:16:00 -04:00
Kyle Spearrin
e0c67f87b0 only clear cache if it hasnt been done in a while 2017-07-13 11:11:04 -04:00
Kyle Spearrin
352c8ee867 clear cache and open file on iOS 2017-07-13 10:51:45 -04:00
Kyle Spearrin
fe5cc1f8f3 conditions around opening file 2017-07-13 09:01:00 -04:00
Kyle Spearrin
eec4be1845 label right detail cell for attachments 2017-07-13 00:02:37 -04:00
Kyle Spearrin
2f86b5c7b0 show indicator when downloading attachment 2017-07-12 23:45:05 -04:00
Kyle Spearrin
0d672c4f99 sync attachment removals 2017-07-12 23:36:27 -04:00
Kyle Spearrin
ac3fdbc2cd download, decrypt and open attachment files 2017-07-12 23:09:44 -04:00
Kyle Spearrin
0a7ad44d23 sync and display attachments on view login 2017-07-12 16:23:24 -04:00
Kyle Spearrin
18a86d3f12 model adjustments 2017-07-12 15:16:36 -04:00
Kyle Spearrin
665e66a9a6 prod url for duo connector 2017-06-29 15:03:48 -04:00
Kyle Spearrin
06dc4117c7 ios webview fix and language updates 2017-06-29 14:55:13 -04:00
Kyle Spearrin
2651afcef0 2fa corrections 2017-06-29 12:42:59 -04:00
Kyle Spearrin
ce4d828380 l10n for 2fa and dismiss keyboard message 2017-06-29 12:11:07 -04:00
Kyle Spearrin
74fba486bd two-factor other methods switching and send email 2017-06-29 11:22:06 -04:00
Kyle Spearrin
56075cb7d9 read yubikey and log in 2017-06-28 22:24:04 -04:00
Kyle Spearrin
d71bc775d5 hybrid web view and duo html/js 2017-06-28 13:10:47 -04:00
Kyle Spearrin
45c5801538 detect nfc enabled 2017-06-28 08:27:06 -04:00
Kyle Spearrin
cf41b524b0 read yubikey otp via nfc 2017-06-27 23:33:13 -04:00
Kyle Spearrin
e2a3e55a17 setup 2fa methods page 2017-06-27 17:10:40 -04:00
Kyle Spearrin
ae35bd2047 encode email for token service key 2017-06-27 16:51:16 -04:00
Kyle Spearrin
2f0ca6f7c0 user specific remember two factor 2017-06-27 16:45:12 -04:00
Kyle Spearrin
37428c01dd remeber two factor token 2017-06-27 16:35:29 -04:00
Kyle Spearrin
4116d95a3e refactors for new 2fa flows 2017-06-27 16:18:32 -04:00
Kyle Spearrin
35ae2b783f undo debugging work 2017-06-27 15:00:21 -04:00
Kyle Spearrin
8a24a6d192 Revert "generate facet id"
This reverts commit 19374a5df4.
2017-06-27 13:48:57 -04:00
Kyle Spearrin
19374a5df4 generate facet id 2017-06-27 12:53:20 -04:00
Kyle Spearrin
12da6fbd18 launch for main activity and catch exceptions 2017-06-23 23:21:39 -04:00
Kyle Spearrin
573ff15925 remove mail sends for crash reports 2017-06-22 21:54:57 -04:00
Kyle Spearrin
1b2abbe321 no param needed 2017-06-22 21:53:44 -04:00
Kyle Spearrin
4a03da6b96 fallback to old KeyStoreStorageService 2017-06-22 21:53:32 -04:00
Kyle Spearrin
cf3998942f save crash file to external storage instead 2017-06-22 15:33:37 -04:00
Kyle Spearrin
0c71f783fc make exceptiond available 2017-06-22 09:42:32 -04:00
Kyle Spearrin
d30b30b24f turn crash emails back on for testing 2017-06-22 09:39:02 -04:00
Kyle Spearrin
7823ec3fc8 hmac check on rsa decrypt 2017-06-19 11:57:37 -04:00
Kyle Spearrin
1e5883f028 clear settings via format as prefix 2017-06-12 13:06:46 -04:00
Kyle Spearrin
33c3cf4c4f just use SettingsFormat 2017-06-12 12:59:17 -04:00
Kyle Spearrin
f41ace4d7c clear settings for prefix when key is generated 2017-06-12 12:56:18 -04:00
Kyle Spearrin
65d2d45a82 manually set validity. no more crash emails 2017-06-12 11:51:43 -04:00
Kyle Spearrin
47ca483459 catch decrypt migrate exceptions 2017-06-12 10:45:57 -04:00
Kyle Spearrin
ee759af078 version bump 2017-06-10 22:44:35 -04:00
Kyle Spearrin
872037cf4d New Crowdin translations (#99)
* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Thai)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Russian)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (French)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Italian)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Italian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations AppResources.resx (Chinese Simplified)
2017-06-10 22:42:53 -04:00
Kyle Spearrin
6aaa083157 use aes key in keystore on "new" android. migrate. 2017-06-10 22:18:34 -04:00
Kyle Spearrin
6a88524f8e rename to AndroidKeyStoreStorageService 2017-06-10 10:52:13 -04:00
Kyle Spearrin
82d93d2602 move variables in scope 2017-06-09 22:19:04 -04:00
Kyle Spearrin
d62037ef6a apparently manifest merge doesn't work in Xamarin 2017-06-09 21:49:20 -04:00
Kyle Spearrin
7314b5a339 manually remove contacts and account permissions 2017-06-09 16:18:21 -04:00
Kyle Spearrin
62bc230521 New Crowdin translations (#98)
* New translations AppResources.resx (Indonesian)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Hindi)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Hindi)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Czech)

* New translations copy.resx (Finnish)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations AppResources.resx (Italian)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Finnish)

* New translations copy.resx (Italian)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)
2017-06-09 10:02:55 -04:00
Kyle Spearrin
3e0d34d148 version bump. deprecate KeyStoreStorageService 2017-06-08 21:20:56 -04:00
Kyle Spearrin
aff1cc1cc3 fallback to "old" KeyStoreStorageService 2017-06-08 20:37:44 -04:00
Kyle Spearrin
6ddc7fa4cc version bump 2017-06-08 16:22:52 -04:00
Kyle Spearrin
957db1ec11 launch android app packages 2017-06-08 16:22:11 -04:00
Kyle Spearrin
ae806da3f1 ubdo debugging items 2017-06-08 15:57:07 -04:00
Kyle Spearrin
6a03c3e77d Do not show launch unless starts with HTTP 2017-06-08 15:43:01 -04:00
Kyle Spearrin
72b18eadf3 do not implement UnhandledExceptionRaiser 2017-06-08 15:13:58 -04:00
Kyle Spearrin
67aa583709 disable screenshot blocking 2017-06-08 14:33:52 -04:00
Kyle Spearrin
21f3755e44 version bump. all unhandled crash report email 2017-06-08 12:44:16 -04:00
Kyle Spearrin
c9b6df846e version bump 2017-06-08 11:52:54 -04:00
Kyle Spearrin
7e23a8169f make crash email util 2017-06-08 11:52:29 -04:00
Kyle Spearrin
b139eadf0b KeyStoreBackedStorageService email crash reports 2017-06-08 11:43:26 -04:00
Kyle Spearrin
71ad648331 version bump 2017-06-07 22:07:25 -04:00
Kyle Spearrin
b8c7752356 oaep spec only for "new android" 2017-06-07 21:44:53 -04:00
Kyle Spearrin
b157f2085f android:allowBackup false 2017-06-07 15:52:40 -04:00
Kyle Spearrin
2fda7b8011 safety checks for popping modals 2017-06-07 10:19:56 -04:00
Kyle Spearrin
5b24d19630 remove unnecessary prop setting from gen spec 2017-06-07 00:43:46 -04:00
Kyle Spearrin
76652f6c6b KeyGenParameterSpec options added back. cleanup. 2017-06-07 00:10:31 -04:00
Kyle Spearrin
724ae51110 RSA/ECB/OAEPWithSHA-1AndMGF1Padding 2017-06-06 23:52:52 -04:00
Kyle Spearrin
1503124108 OAEPParameterSpec and provider specified 2017-06-06 23:27:57 -04:00
Kyle Spearrin
007125a071 include crypto providers with crash reprot email 2017-06-06 23:09:19 -04:00
Kyle Spearrin
b5f5b0b4aa sha1 digest 2017-06-06 22:53:14 -04:00
Kyle Spearrin
cbda59e547 switch to default oaep padding 2017-06-06 22:50:20 -04:00
Kyle Spearrin
a885e16049 email crash report for key store service 2017-06-06 22:04:54 -04:00
Kyle Spearrin
07eabad18d throw exceptions for testing 2017-06-06 08:10:07 -04:00
Kyle Spearrin
cf079a159f cleanup rsa encryption 2017-06-05 22:25:59 -04:00
Kyle Spearrin
93176989fd centralized crypto utils. keystore with rsa. 2017-06-05 21:04:19 -04:00
Kyle Spearrin
7a56141894 Update AndroidManifest.xml 2017-06-04 21:07:45 -04:00
Kyle Spearrin
31cc0ff6e9 version bump 2017-06-04 21:04:27 -04:00
Kyle Spearrin
8719b3eb64 revert back to KeyPairGeneratorSpec
KeyGenParameterSpec crashes
2017-06-02 21:58:20 -04:00
Kyle Spearrin
5347624455 credits for translators 2017-06-02 21:07:18 -04:00
Kyle Spearrin
25210339d9 detect new languages properly 2017-06-02 17:49:56 -04:00
Kyle Spearrin
72c7cd2536 show launch fixes 2017-06-02 17:09:09 -04:00
Kyle Spearrin
d018eeb376 key on login bug 2017-06-02 16:53:43 -04:00
Kyle Spearrin
d1424276bc new localization resources 2017-06-02 16:28:56 -04:00
Kyle Spearrin
cf9696a8cf New Crowdin translations (#94)
* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Thai)

* New translations copy.resx (Portuguese, Brazilian)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Czech)

* New translations copy.resx (Finnish)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations AppResources.resx (Italian)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Italian)

* New translations copy.resx (Italian)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Finnish)

* New translations copy.resx (Italian)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)
2017-06-02 16:01:38 -04:00
Kyle Spearrin
a7cbe526e3 autofill typo and update layout timer 2017-06-02 15:45:09 -04:00
Kyle Spearrin
fe1c58ad27 use AuthenticationRequestConfiguration 2017-06-02 15:16:26 -04:00
Kyle Spearrin
753d01d413 update fingerprint libraries 2017-06-02 14:46:10 -04:00
Kyle Spearrin
feacb3ed14 remove unity from linker. proper http handlers 2017-06-02 11:21:17 -04:00
Kyle Spearrin
f5b1e6d03a GET_ACCOUNTS permission no longer needed for gcm 2017-06-01 22:27:28 -04:00
Kyle Spearrin
46fc2dd8d0 simple injector instead of unity 2017-06-01 14:50:17 -04:00
Kyle Spearrin
b063aae130 Revert "convert nuget references"
This reverts commit 655a729143.
2017-06-01 14:23:20 -04:00
Kyle Spearrin
655a729143 convert nuget references 2017-06-01 14:21:54 -04:00
Kyle Spearrin
5d2138b95e resolve push JIT 2017-06-01 11:29:08 -04:00
Kyle Spearrin
0b24cc29c1 check security stamp when syncing profile 2017-05-31 23:09:21 -04:00
Kyle Spearrin
2fa7b532b1 new enc key implementation 2017-05-31 22:47:19 -04:00
Kyle Spearrin
aa1ed52f64 notification closes after 30 seconds in app 2017-05-31 08:29:58 -04:00
Kyle Spearrin
29dddd7d62 help site articles 2017-05-30 14:52:57 -04:00
Kyle Spearrin
6ddbea316a add close button for ios 2017-05-30 14:46:45 -04:00
Kyle Spearrin
8da80f0710 fix bug with button binding 2017-05-30 14:24:29 -04:00
Kyle Spearrin
24382b8607 resolving warnings for obsolete APIs 2017-05-30 14:13:53 -04:00
Kyle Spearrin
65438e837d check android for event wireup 2017-05-30 13:23:45 -04:00
Kyle Spearrin
1a3cb8b623 Revert "update ioc"
This reverts commit 9ae734672b.
2017-05-30 12:01:05 -04:00
Kyle Spearrin
6bf4a0d09d entitlements for adhoc simulator 2017-05-30 12:00:42 -04:00
Kyle Spearrin
9ae734672b update ioc 2017-05-30 11:36:06 -04:00
Kyle Spearrin
cfa84476c8 Revert "added forms package to ios libs"
This reverts commit e92d091cb3.
2017-05-30 10:29:38 -04:00
Kyle Spearrin
5b0d160df4 Revert "packages that are in ios must also be in extension"
This reverts commit 13ff0846b1.
2017-05-30 10:29:28 -04:00
Kyle Spearrin
41f858eb04 Revert "adjusted references to google analytics"
This reverts commit 5895b37965.
2017-05-30 10:29:16 -04:00
Kyle Spearrin
c5753b898a Revert "reinstall GA and Download packages"
This reverts commit 337382b7e6.
2017-05-30 10:28:51 -04:00
Kyle Spearrin
c6810409c7 Revert "update download package"
This reverts commit 98718c0693.
2017-05-30 10:28:33 -04:00
Kyle Spearrin
f6c16ec53d min priority notification for persist option 2017-05-30 09:24:29 -04:00
Kyle Spearrin
84a6ee8cbf autofill fixes for password focus 2017-05-30 08:35:57 -04:00
Kyle Spearrin
e651a13980 compare with _lastNotificationUri 2017-05-30 08:18:56 -04:00
Kyle Spearrin
f494570725 back to marshmallow again 2017-05-29 21:52:12 -04:00
Kyle Spearrin
5955ca74d2 api level N 2017-05-29 20:53:02 -04:00
Kyle Spearrin
eb4fa8620d dont skip if there is something to autofill 2017-05-29 20:45:42 -04:00
Kyle Spearrin
34fe7dd6d1 back to marshmallow 2017-05-29 20:15:11 -04:00
Kyle Spearrin
4cbb3cb43c priority min 2017-05-29 19:41:52 -04:00
Kyle Spearrin
050acdf580 target android N framework 2017-05-29 19:40:27 -04:00
Kyle Spearrin
358da4051e comment out BuildVersionCodes N check 2017-05-29 11:43:55 -04:00
Kyle Spearrin
ffb51c1515 new autofill feature settings 2017-05-29 11:38:03 -04:00
Kyle Spearrin
72d4952812 support for org.codeaurora.swe.browser 2017-05-29 08:35:36 -04:00
Kyle Spearrin
04bf86c21d key store cleanup 2017-05-27 22:21:45 -04:00
Kyle Spearrin
d392dc82a1 settings features page setup with analytics cell 2017-05-27 14:52:37 -04:00
Kyle Spearrin
f7f4289614 keystore fixes 2017-05-27 12:23:35 -04:00
Kyle Spearrin
72f9951cb1 key names 2017-05-27 11:46:42 -04:00
Kyle Spearrin
8450f56093 fix project refs 2017-05-27 11:45:03 -04:00
Kyle Spearrin
cb2a25ad46 migrate and cleanup old key store 2017-05-27 11:42:31 -04:00
Kyle Spearrin
a028172cf6 New Crowdin translations (#91)
* New translations AppResources.resx (Japanese)

* New translations copy.resx (Hindi)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Czech)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Russian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Portuguese, Brazilian)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (Spanish)
2017-05-27 11:29:48 -04:00
Kyle Spearrin
91aa48ac9a Update Crowdin configuration file 2017-05-27 11:27:24 -04:00
Kyle Spearrin
218320749f KeyStoreBackedStorageService 2017-05-27 01:05:12 -04:00
Kyle Spearrin
6a1ff56e7b support new push models 2017-05-26 22:55:48 -04:00
Kyle Spearrin
8f7c4951b8 help article for lost 2fa 2017-05-25 23:33:50 -04:00
Kyle Spearrin
6215a7d65e on demand password node scans for autofill 2017-05-25 23:16:48 -04:00
Kyle Spearrin
0e28b1ffe1 add id resources 2017-05-25 22:20:39 -04:00
Kyle Spearrin
7dd435d677 New Crowdin translations (#90)
* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations copy.resx (Indonesian)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations AppResources.resx (Spanish)
2017-05-25 22:18:45 -04:00
Kyle Spearrin
7fd5209cdb always set backing key values 2017-05-25 12:50:39 -04:00
Kyle Spearrin
ed5b6962d7 include new resource files 2017-05-24 17:11:21 -04:00
Kyle Spearrin
98718c0693 update download package 2017-05-24 17:09:24 -04:00
Kyle Spearrin
f02588855a New Crowdin translations (#89)
* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Czech)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations copy.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Russian)

* New translations copy.resx (Russian)

* New translations copy.resx (Russian)

* New translations AppResources.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Japanese)

* New translations copy.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations AppResources.resx (Hindi)

* New translations copy.resx (Hindi)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Portuguese)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Spanish)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Portuguese)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)

* New translations AppResources.resx (Slovak)
2017-05-24 09:03:52 -04:00
Kyle Spearrin
c63841fdee Update Crowdin configuration file 2017-05-23 12:49:00 -04:00
Kyle Spearrin
b49b4601cd New Crowdin translations (#88)
* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (French)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Spanish)
2017-05-23 10:29:59 -04:00
Kyle Spearrin
ed352d2d21 New Crowdin translations (#86)
* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (French)

* New translations AppResources.resx (Swedish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (French)
2017-05-22 08:18:44 -04:00
Kyle Spearrin
dab56121a2 New Crowdin translations (#85)
* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations copy.resx (Chinese Traditional)

* New translations AppResources.resx (Chinese Traditional)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Chinese Simplified)

* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Finnish)

* New translations copy.resx (French)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations AppResources.resx (French)
2017-05-21 13:36:42 -04:00
Kyle Spearrin
df02afaed9 Update appveyor.yml 2017-05-21 13:31:55 -04:00
Kyle Spearrin
e6fe121c1e Update appveyor.yml 2017-05-21 13:24:44 -04:00
Thomas
b37fbc1284 Create AppResources.zh-Hant.resx (#64) 2017-05-21 13:23:27 -04:00
Kyle Spearrin
f5ac554022 Update Crowdin configuration file 2017-05-21 13:21:16 -04:00
Kyle Spearrin
df76c82449 Update CONTRIBUTING.md 2017-05-20 23:29:39 -04:00
Kyle Spearrin
8f1f978800 Update CONTRIBUTING.md 2017-05-20 23:28:29 -04:00
Kyle Spearrin
bf3cc6690c Update README.md 2017-05-20 23:19:26 -04:00
Kyle Spearrin
20ba7eaaf3 New Crowdin translations (#79)
* New translations copy.resx (Spanish)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Spanish)

* New translations copy.resx (French)

* New translations copy.resx (Spanish)

* New translations AppResources.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (Swedish)

* New translations copy.resx (French)

* New translations copy.resx (French)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations copy.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (French)

* New translations copy.resx (Finnish)

* New translations copy.resx (Finnish)

* New translations AppResources.resx (Chinese Simplified)

* New translations AppResources.resx (Finnish)

* New translations AppResources.resx (Chinese Simplified)
2017-05-20 22:58:50 -04:00
Kyle Spearrin
95708cd5ab Update Crowdin configuration file 2017-05-20 22:45:35 -04:00
Kyle Spearrin
fba58bba71 moving all store copy into resx files 2017-05-20 22:30:39 -04:00
Kyle Spearrin
bc6ff3e3bc prevent rapid clicking actions that crash app 2017-05-20 12:36:27 -04:00
Kyle Spearrin
3415be4c56 handle some crash cases 2017-05-20 12:36:27 -04:00
Kyle Spearrin
05d6f5d806 Update README.md 2017-05-19 13:39:37 -04:00
Kyle Spearrin
ed8266bb43 Update README.md 2017-05-19 13:23:52 -04:00
Kyle Spearrin
759f35ff9c Update SECURITY.md 2017-05-19 12:03:49 -04:00
Kyle Spearrin
bcac8f1599 Update SECURITY.md 2017-05-19 12:03:11 -04:00
Kyle Spearrin
0abf054825 null checks on _tableItems 2017-05-19 11:21:25 -04:00
Kyle Spearrin
825b76e28e en file not needed 2017-05-19 11:21:25 -04:00
Peter Karlsson
0a13ac142e Additional swedish strings (#78)
* Additional swedish strings

Additional translated strings for search, auto-fill and organisations.

* Added sneaky string

Sneaky analytics string in the middle added.
2017-05-18 20:18:13 -04:00
Kyle Spearrin
566e6634a6 Create SECURITY.md 2017-05-17 11:35:06 -04:00
Kyle Spearrin
4b888e6911 en resources file 2017-05-16 21:02:06 -04:00
Kyle Spearrin
0cfc89f574 en as first language 2017-05-16 10:01:36 -04:00
Kyle Spearrin
337382b7e6 reinstall GA and Download packages 2017-05-16 10:00:38 -04:00
Kyle Spearrin
4ed657c930 Merge branch 'master' of github.com:bitwarden/mobile 2017-05-16 09:54:56 -04:00
Kyle Spearrin
5895b37965 adjusted references to google analytics 2017-05-16 09:54:39 -04:00
Igetin
6979b8e11e Correct a typo (#74) 2017-05-15 07:53:26 -04:00
Primokorn
20713cf158 Update AppResources.fr.resx (#75) 2017-05-15 07:51:11 -04:00
Kyle Spearrin
13ff0846b1 packages that are in ios must also be in extension 2017-05-13 11:02:56 -04:00
Kyle Spearrin
e92d091cb3 added forms package to ios libs 2017-05-13 10:40:58 -04:00
Kyle Spearrin
6b1a435cdc init _tableItems as empty list 2017-05-11 00:34:54 -04:00
Kyle Spearrin
3f04b465f3 version bump 2017-05-06 21:31:09 -04:00
Kyle Spearrin
3f5c8fe2cb IdentityHttpClient url fix 2017-05-06 21:21:20 -04:00
Kyle Spearrin
d1cf6c68f3 identity server client for auth 2017-05-06 20:20:57 -04:00
Kyle Spearrin
7117f00480 bump build number 2017-05-03 22:35:45 -04:00
Kyle Spearrin
d4f37343a2 added required NSPhotoLibraryUsageDescription key 2017-05-03 22:25:00 -04:00
Kyle Spearrin
71e15e9cab remove CFBundleExecutable again 2017-05-03 22:01:20 -04:00
Kyle Spearrin
eadf00feba testing add back CFBundleExecutable 2017-05-03 15:37:32 -04:00
Kyle Spearrin
95f28fad2b remove CFBundleExecutable 2017-05-03 15:11:21 -04:00
Kyle Spearrin
9753137a72 version bump 2017-05-03 11:43:56 -04:00
Kyle Spearrin
e4f7436dfb do not animate autofill on mobile
- Animate seems to now cause a JS error when autofilling on iOS, which
stops the password from autofilling. Turn the option off.
2017-05-03 09:53:40 -04:00
Kyle Spearrin
d39211310d make notes taller. autofocus name field on add 2017-05-02 19:41:57 -04:00
Kyle Spearrin
0a6fb3ec0a Comment out test nodes 2017-04-30 17:17:40 -04:00
Kyle Spearrin
5232cf7cec remove beta tag from autofill in tools listing 2017-04-28 12:27:03 -04:00
Kyle Spearrin
6e16ffe05f autofill listing page name for android app fixes 2017-04-28 12:25:29 -04:00
Kyle Spearrin
2d6895aeea android app match fixes 2017-04-28 12:14:53 -04:00
Kyle Spearrin
b5311e1448 moved locked sets to AppSettingsService 2017-04-28 11:34:02 -04:00
Kyle Spearrin
cc63eb383d check that now is > LastActivity Date 2017-04-28 11:19:43 -04:00
Kyle Spearrin
01736ca685 Lock Screen Fixes
- Move settings to AppSettingsService
- Update activity on page disappaearing
- Always check if app is currently locked before updating last activity
date
2017-04-28 11:07:26 -04:00
Kyle Spearrin
be47bb7263 (none) => No folder 2017-04-27 16:46:50 -04:00
Kyle Spearrin
bcb7d88ed7 Double HMAC comparison to prevent timing attacks 2017-04-27 12:14:45 -04:00
Kyle Spearrin
cf58c1b4b5 only fetch keys if there are some orgs 2017-04-26 11:58:52 -04:00
Kyle Spearrin
70c57928e7 Compat. - no header for AesCbc256_B64 cipherstring 2017-04-26 11:28:03 -04:00
Kyle Spearrin
c8219b29c0 encrypted private key and org keys at rest 2017-04-25 16:05:13 -04:00
Kyle Spearrin
15a9f80430 Tools share cell 2017-04-25 14:48:42 -04:00
Kyle Spearrin
0684dfe869 only parse list as URL if dict case fails 2017-04-24 22:22:12 -04:00
Kyle Spearrin
83a89566ac parse url for older extension 2017-04-24 18:05:23 -04:00
Kyle Spearrin
04f486b003 process string for firefox browsers 2017-04-24 17:40:17 -04:00
Kyle Spearrin
f135c92434 add new dependencies to extention container 2017-04-24 16:56:34 -04:00
Kyle Spearrin
78b095d01a new share icon size/color 2017-04-24 16:05:16 -04:00
Kyle Spearrin
1b8bd494e2 disable GA exception reporting 2017-04-24 16:04:54 -04:00
Kyle Spearrin
481925ac78 added share icons to ios project 2017-04-24 15:17:11 -04:00
Kyle Spearrin
4854b2b1c0 share icon on vault listing 2017-04-24 15:00:55 -04:00
Kyle Spearrin
2d7b33459e remove refs to "google" 2017-04-24 14:26:16 -04:00
Kyle Spearrin
27e0c7421b rename CryptoKey to SymmetricCryptoKey 2017-04-22 14:37:01 -04:00
Kyle Spearrin
b26c3d050c sync org keys and refactors 2017-04-21 22:33:09 -04:00
Kyle Spearrin
439370e25a new push notification changes and syncing 2017-04-21 14:57:23 -04:00
Kyle Spearrin
1be4f6e20c add support for rsa oaep sha1 enc type 2017-04-21 13:40:29 -04:00
Kyle Spearrin
2714c7cce9 Added more api uris. lock screen bug in ios ext 2017-04-21 09:12:30 -04:00
Kyle Spearrin
952935de23 copy notes when tapped 2017-04-20 16:07:34 -04:00
Kyle Spearrin
bdb8b5ea39 fix crypto tests 2017-04-20 15:53:17 -04:00
Kyle Spearrin
3ad4e28a2c no inline out 2017-04-20 15:49:25 -04:00
Kyle Spearrin
48d0d068d1 try inline out again 2017-04-20 15:44:51 -04:00
Kyle Spearrin
56e166d61a build engine doesnt like inline out params 2017-04-20 15:38:31 -04:00
Kyle Spearrin
672d753adf update libs 2017-04-20 14:54:39 -04:00
Kyle Spearrin
0d9ba92db4 null check on key retrievals 2017-04-20 14:23:58 -04:00
Kyle Spearrin
8cf25d3602 remove old, unnecessary refs for client handler 2017-04-20 14:23:40 -04:00
Kyle Spearrin
a6bc44dc10 No need for custom handler anymore - xam bug fixed 2017-04-20 14:22:11 -04:00
Kyle Spearrin
408d66ee74 update xamarin forms. empty string section titles
There appears to be a bug regression introduced with the new xamarin
forms that removes headers if there is no title. Hack to fix it for now
is to include a empty string header title.
2017-04-20 14:18:16 -04:00
Kyle Spearrin
b136bb74b8 encrypt with org key if needed 2017-04-20 11:40:39 -04:00
Kyle Spearrin
18b2b6f447 set org keys on login and decrypt org ciphers 2017-04-20 11:23:30 -04:00
Kyle Spearrin
490d1775a2 sync folders & added org id for ciphers/logins 2017-04-20 10:47:14 -04:00
Kyle Spearrin
458de2d2e0 set private key on login 2017-04-20 10:29:18 -04:00
Kyle Spearrin
51ae3fc62f clear keys on logout 2017-04-20 10:20:50 -04:00
Kyle Spearrin
58c5c55d09 extend crypto service for org keys 2017-04-20 10:20:24 -04:00
Kyle Spearrin
4c2bcb9e6b IsNullOrWhiteSpace InitializationVector 2017-04-20 00:10:36 -04:00
Kyle Spearrin
498379bb7e privatekey, rsa decryption, org key management 2017-04-20 00:06:11 -04:00
Kyle Spearrin
e7f3b115a4 refactor for enc type header and cryptokey 2017-04-19 23:16:09 -04:00
Kyle Spearrin
0ebfe85d8e centralize login code into auth service 2017-04-19 22:04:43 -04:00
Kyle Spearrin
8e29a990cb Remove userid from Ga service, not being used 2017-04-19 21:05:03 -04:00
Kyle Spearrin
a960ccd786 IP for desktop from emulator 2017-04-19 20:57:40 -04:00
Kyle Spearrin
6b86e836d7 update target framework 2017-04-19 17:11:06 -04:00
Shan
fb35b9b10a Fixes #8 Disable Google Analytics (#55)
* Opt-out of Google Analytics

* Move OptOut to Other in Settings

* Change OptOut Order and Resource key
2017-03-30 18:22:14 -04:00
Kyle Spearrin
a45773e1ca Update README.md 2017-03-21 18:12:21 -04:00
Kyle Spearrin
2405a6f21e Android version bump 2017-03-11 15:05:09 -05:00
Kyle Spearrin
533dd6135e revert test project to target framework 6.0 2017-03-11 12:36:46 -05:00
Kyle Spearrin
efc25543ca revert to target framework 6 2017-03-11 12:32:44 -05:00
Kyle Spearrin
82d4745da3 catch sql crashes in sync service 2017-03-11 12:26:10 -05:00
Kyle Spearrin
ac6e95c442 Added sbrowser beta to supported browsers list 2017-03-09 20:22:06 -05:00
Kyle Spearrin
375f23ac9e parse uri with Uri.TryCreate 2017-02-25 22:03:18 -05:00
Kyle Spearrin
8e5a01d82c More null checks. Catch null exception in accessibility service. 2017-02-25 16:10:18 -05:00
Kyle Spearrin
910658aa93 android version bump 2017-02-23 23:29:00 -05:00
Kyle Spearrin
d766ffa040 dont null out disposed objects 2017-02-23 23:12:39 -05:00
Kyle Spearrin
b960640e03 version bump 2017-02-22 22:56:08 -05:00
Kyle Spearrin
c984617b1c null out testNodesData 2017-02-22 22:54:18 -05:00
Kyle Spearrin
a12a7127c0 Update README.md
amazon app badge
2017-02-22 19:49:25 -05:00
Kyle Spearrin
98a6a5c93d Added null checking throughout autofill service 2017-02-22 19:00:50 -05:00
Kyle Spearrin
27202fd740 amazon store information 2017-02-22 00:19:42 -05:00
Kyle Spearrin
c01d02de27 dispose nodes instead of manual GC 2017-02-20 18:22:24 -05:00
Kyle Spearrin
1d23bcc979 Update README.md 2017-02-19 23:20:51 -05:00
Kyle Spearrin
ac8abdaa17 readme store badge updates 2017-02-19 23:19:55 -05:00
Kyle Spearrin
613977c6f9 updates to manual GC 2017-02-19 17:29:00 -05:00
Kyle Spearrin
54159c9d05 Do some manual GCing 2017-02-18 21:33:06 -05:00
Kyle Spearrin
8d5d477b4a version bump 2017-02-18 17:47:27 -05:00
Kyle Spearrin
2c73906ad3 fix GetWindowNodes recusion 2017-02-18 15:48:24 -05:00
Kyle Spearrin
079fb34120 pass nodes as reference 2017-02-18 10:50:27 -05:00
Kyle Spearrin
17ed1cdc00 increase autofill toast timeout to 10 seconds 2017-02-18 00:23:47 -05:00
Kyle Spearrin
d53ea584ba Better way of checking for autofill sevrice running 2017-02-17 23:22:02 -05:00
Kyle Spearrin
b435256911 handle locked status better. once locked, stay locked. 2017-02-17 23:03:54 -05:00
Kyle Spearrin
27e996dba0 Detach events 2017-02-17 21:18:59 -05:00
Kyle Spearrin
22f3bd1073 tearing down event handlers on page disappears 2017-02-17 00:16:09 -05:00
Kyle Spearrin
fb564fa817 add support for CM browser 2017-02-16 23:09:40 -05:00
Kyle Spearrin
be9db2930f autofill intent fixes 2017-02-16 22:22:19 -05:00
Kyle Spearrin
5bce95a686 Added support for Yandex browser. Turned push sevrice back on 2017-02-16 21:14:37 -05:00
maxlandry
f6ca9b9d0f Corrections + new french translations (#46)
Various grammar and spelling corrections.
Replace all «sites» mentions with «logins» (identifiants) mentions.
Add and translate lines 760 to 819.
2017-02-16 20:57:06 -05:00
Kyle Spearrin
88f186907b backets for PS commands 2017-02-16 20:05:20 -05:00
Kyle Spearrin
9faf1d9de5 appveyor env checks for powershell commands 2017-02-16 19:57:35 -05:00
Kyle Spearrin
8b1d1d0f6d http ref for ios core 2017-02-15 23:06:26 -05:00
Kyle Spearrin
8c19e2c3f2 system.net.http ref for ios 2017-02-15 23:02:33 -05:00
Kyle Spearrin
d2d8ee504d cached images 2017-02-15 21:56:02 -05:00
Kyle Spearrin
d96b279beb disable push service 2017-02-15 19:55:52 -05:00
Kyle Spearrin
f5e7f9249c attach and detach event handlers onappearing and ondisappearing to free up views for GC 2017-02-15 00:28:05 -05:00
Kyle Spearrin
56c33ee82b Aitpfill fixes for main page set. Memory service for monitoring memory use on Android. 2017-02-14 19:47:00 -05:00
Kyle Spearrin
b05dd4cc2c autofill search UX improvements 2017-02-13 22:35:16 -05:00
Kyle Spearrin
36d4ce8718 more updates to autofill flow 2017-02-13 22:10:34 -05:00
Kyle Spearrin
ddec7ab643 app veyor env checks 2017-02-13 21:57:11 -05:00
Kyle Spearrin
75201c9b30 Added fuzzy matches to autofill listing page. Allow autofilling from main vault search page when arriving from autofill service 2017-02-13 19:12:02 -05:00
Peter Karlsson
99c81e5a5d Swedish translation additional strings update (#39)
* Add files via upload

* Sync

* Swedish translation additional strings update

* Updated short description (too long)
2017-02-11 12:58:14 -05:00
Kyle Spearrin
b84ad39133 appveyor.yml 2017-02-11 01:13:03 -05:00
Kyle Spearrin
4a19e2b673 added max character info to captions 2017-02-11 00:31:23 -05:00
Kyle Spearrin
475c3559f6 new screenshots and caption for google store 2017-02-11 00:14:16 -05:00
Kyle Spearrin
58246f72dd version bump 2017-02-10 19:31:37 -05:00
Kyle Spearrin
b90ce2a2af token refresh bad requests are to be treated as unauthorized 2017-02-10 19:16:23 -05:00
Kyle Spearrin
4a0fc5ca0e crash fixes 2017-02-09 22:06:39 -05:00
Kyle Spearrin
c29d902b8e Autofill service alert when adding new login for the first time and autofill isnt turned on. Added fi language to project. 2017-02-09 21:43:03 -05:00
Kyle Spearrin
ab629c2048 autofill intent is only valid for limited time 2017-02-09 21:06:47 -05:00
Kyle Spearrin
e970ca49e8 Clear intent from autofill. Background app when back button on lock page. 2017-02-09 18:12:34 -05:00
Kyle Spearrin
99e78092ed dont compare the creds uri since it could be a different, equivalent domain 2017-02-09 00:20:29 -05:00
Kyle Spearrin
4af91b5ab6 Update ios extension to use new login service lookup by uristring 2017-02-09 00:12:09 -05:00
Kyle Spearrin
539121070a Added equivalent domain checks to autofill listing filter. centralized logic in login service. 2017-02-08 23:58:37 -05:00
Kyle Spearrin
2a1bd92e1a sync domain settings 2017-02-08 22:04:07 -05:00
Kyle Spearrin
2c1ebc0439 setup settings api repository 2017-02-08 21:19:09 -05:00
Kyle Spearrin
2d605f5dfb remove old sync helper for removing ciphers (was for inc syncing) 2017-02-08 20:45:56 -05:00
Kyle Spearrin
0cd09cf03a setup new settings service 2017-02-08 20:44:35 -05:00
Kyle Spearrin
3ad1e8a3ba set up user settings data table and access repository 2017-02-08 20:39:37 -05:00
Kyle Spearrin
230722945e move settings pages to modals instead of navigation pages 2017-02-08 19:18:34 -05:00
Kyle Spearrin
a429dcf978 Fix wrong key when decrypting cipher with mac 2017-02-08 19:07:38 -05:00
Kyle Spearrin
0131031ac4 Skip event if no package name 2017-02-08 18:19:59 -05:00
Kyle Spearrin
a418fc810a log out when checking account reivison if authentication issue 2017-02-08 00:19:30 -05:00
Kyle Spearrin
e71adbd26d null checks when error handling 2017-02-07 21:56:28 -05:00
Kyle Spearrin
8a525aee8a check old auth bearer for logged in status as well 2017-02-07 21:19:23 -05:00
Kyle Spearrin
463b0fa28a remove incremental syncs and move to full syncs with revision checks 2017-02-06 23:40:24 -05:00
Kyle Spearrin
007ebadf16 removed root var 2017-02-06 22:02:29 -05:00
Kyle Spearrin
c7af81bf0c Cleanup hacks because of Intent LaunchedFromHistory bug 2017-02-06 19:39:07 -05:00
Kyle Spearrin
749508871b Handle all exceptions from API calls 2017-02-06 09:55:35 -05:00
Kyle Spearrin
d112e0ea42 two-factor login re-worked with new auth flow 2017-02-06 09:39:07 -05:00
Kyle Spearrin
54f8771a9c better error parsing 2017-02-06 09:15:10 -05:00
Kyle Spearrin
0a3c83288e Added AutofillService to GA 2017-02-05 23:59:43 -05:00
Kyle Spearrin
52a866147e Optimized startup tasks to only happen when necessary. Added some GA telemetry to autofill. 2017-02-05 23:55:58 -05:00
Igetin
6629eaf485 Added Finnish translations (#37)
* Added strings for Finnish translation

* Added Finnish App Store description

* Added Finnish captions for screenshots

* Added Finnish Play Store description

* Added Finnish captions for screenshots
2017-02-05 07:16:29 -05:00
Kyle Spearrin
74239521cd HandleTokenStateAsync before each API call for refresh and auth bearer migration 2017-02-04 23:31:37 -05:00
Kyle Spearrin
8ae95c4e30 dont read line at end of publisher script 2017-02-04 21:53:56 -05:00
Kyle Spearrin
c31e191d7e add backslashes 2017-02-04 21:40:46 -05:00
Kyle Spearrin
c3134f779d args for increment version script 2017-02-04 21:35:02 -05:00
Kyle Spearrin
d4749c139b increment version script 2017-02-04 21:19:54 -05:00
Kyle Spearrin
63d6c32063 play store creds 2017-02-04 20:52:20 -05:00
Kyle Spearrin
08299902e3 switch to google creds 2017-02-04 19:05:39 -05:00
Kyle Spearrin
db04d6e642 Create google play publisher console application 2017-02-04 12:04:57 -05:00
Kyle Spearrin
6ddbd77009 encrypted keystore for CI builds 2017-02-04 01:33:16 -05:00
Kyle Spearrin
4a4779fc63 Converted auth to identity server endpoints and utilize bearer2 access token 2017-02-04 01:12:25 -05:00
Kyle Spearrin
46bb8d2cb5 added back FromAutofillService functionality 2017-02-03 23:21:40 -05:00
Kyle Spearrin
31b2eeb293 remove lots of mainpage code since we allow closing of autofill page now 2017-02-03 00:26:55 -05:00
Kyle Spearrin
8e9becd579 dont main page on sleep 2017-02-03 00:12:53 -05:00
Kyle Spearrin
d067de086d autofill fixes 2017-02-02 23:36:40 -05:00
Kyle Spearrin
8c6d395d89 remove uri extra after captured 2017-02-02 23:05:24 -05:00
Kyle Spearrin
f66b26a866 beta title 2017-02-02 22:30:34 -05:00
Kyle Spearrin
83f00d69ce added close button to autofill list page. if uri is a website on api level < 21, do not autofill and present modal for copying 2017-02-02 22:20:45 -05:00
Kyle Spearrin
8b2923b56d Add more browser support for fetching URL 2017-02-02 19:39:00 -05:00
Kyle Spearrin
46af313c25 AutoFillServiceDescription 2017-02-01 22:03:35 -05:00
Kyle Spearrin
85dda759ec updated autofill service tools page with new tutorial images 2017-02-01 21:55:00 -05:00
Kyle Spearrin
27fb44277f Accessibility service setup pages 2017-02-01 00:38:35 -05:00
Kyle Spearrin
ea1aafbab2 WIP on accessibility service 2017-01-31 22:53:32 -05:00
Kyle Spearrin
2c446f939e accessibility service WIP 2017-01-31 20:45:51 -05:00
Kyle Spearrin
47e427a851 wip autofill tweaks 2017-01-31 00:30:41 -05:00
Kyle Spearrin
95b8efae20 set color for autofill notification 2017-01-30 23:41:39 -05:00
Kyle Spearrin
53774735d4 autofill wip 2017-01-30 23:33:02 -05:00
Kyle Spearrin
36c6c5a35e Accessibility service WIP 2017-01-30 19:26:39 -05:00
Kyle Spearrin
0beb07c87e Update CONTRIBUTING.md 2017-01-29 11:32:48 -05:00
Kyle Spearrin
64fd8e3be9 autofill service WIP 2017-01-28 23:58:26 -05:00
Kyle Spearrin
45c516ea3f cleanup on autofill 2017-01-27 23:32:48 -05:00
Kyle Spearrin
26667c0a59 autofill WIP into main activity. created login selection page 2017-01-27 23:13:28 -05:00
Kyle Spearrin
61e0379eb3 autofill cleanup WIP 2017-01-23 23:32:52 -05:00
Kyle Spearrin
759df9bdd5 Autofill WIP 2017-01-23 21:28:38 -05:00
Johannes Grönvall
33e7ca08d8 Changes (#32)
Refined the Swedish translations
2017-01-13 08:26:40 -05:00
Primokorn
c3d0d8bf63 Update AppResources.fr.resx (#33) 2017-01-13 08:26:21 -05:00
Kyle Spearrin
8387f1e204 Update packages 2017-01-05 23:54:14 -05:00
Kyle Spearrin
fe778293c1 renaming files for Site => Login refactor 2017-01-03 00:25:17 -05:00
Kyle Spearrin
991afb7722 Reactor rename Sites => Logins 2017-01-03 00:17:15 -05:00
Kyle Spearrin
a176542114 ARM64 architecutre on app extension 2016-12-31 11:47:35 -05:00
Kyle Spearrin
a3f555e816 added new translations for credits page 2016-12-30 22:49:58 -05:00
Kyle Spearrin
dae5453e13 Added translators to credits page 2016-12-30 22:44:17 -05:00
Kyle Spearrin
082826287e Added french translation to the build 2016-12-30 22:39:21 -05:00
Primokorn
7418691cf3 Create french CAPTIONS.md (#28) 2016-12-30 22:28:03 -05:00
Primokorn
29e72de64b Create french COPY.md (#29)
* Create french COPY.md

* Update COPY.md
2016-12-30 22:27:52 -05:00
Primokorn
4955b4a4a8 Create french CAPTIONS.md (#30) 2016-12-30 22:27:12 -05:00
Primokorn
7c76595314 Create french COPY.md (#31) 2016-12-30 22:26:57 -05:00
Primokorn
1495003103 Create AppResources.fr.resx (#27) 2016-12-30 10:42:39 -05:00
Peter Karlsson
fc1b74d48f Fix and missed translations (#26) 2016-12-29 02:39:11 -05:00
Kyle Spearrin
830d0e9e7a readme updates 2016-12-29 00:40:09 -05:00
Kyle Spearrin
7310c06162 readme updates 2016-12-29 00:38:53 -05:00
Kyle Spearrin
045ccaa219 readme updates 2016-12-29 00:26:14 -05:00
Peter Karlsson
9d6a276342 Additional strings update (#25) 2016-12-26 21:31:31 -05:00
Kyle Spearrin
9204d25b62 Applied i18n strings to missing parts in app extension 2016-12-26 21:22:55 -05:00
Kyle Spearrin
6c847292c7 simplified chinese used for all chinese languages for now 2016-12-26 14:38:18 -05:00
Kyle Spearrin
b2712119d1 Chinese support on iOS 2016-12-26 13:39:14 -05:00
Kyle Spearrin
7728046309 layout fixes 2016-12-26 11:30:57 -05:00
Kyle Spearrin
17e18a2a7a Added contains and clear implementations for iOS Settings 2016-12-26 10:49:34 -05:00
Kyle Spearrin
ce8bedb340 zh-Hans fix 2016-12-24 22:44:47 -05:00
Kyle Spearrin
14dc42e148 Fixes for language resources 2016-12-24 22:43:50 -05:00
Peter Karlsson
442c2294e9 Update AppResources.sv.resx (#23) 2016-12-24 22:19:24 -05:00
Peter Karlsson
5334514d55 Swedish translation (#22) 2016-12-24 20:43:06 -05:00
Kyle Spearrin
0d5b431e6a version bump 2016-12-24 11:57:37 -05:00
Kyle Spearrin
8b10ee0028 better error handling in base repo 2016-12-24 11:47:29 -05:00
Kyle Spearrin
9682abdded HttpService abstraction with CustomAndroidClientHandler to handle xamarin android bug with error response body 2016-12-24 10:54:18 -05:00
1357 changed files with 134437 additions and 35672 deletions

112
.editorconfig Normal file
View File

@@ -0,0 +1,112 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Don't use tabs for indentation.
[*]
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4
insert_final_newline = true
charset = utf-8-bom
# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# Xml config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2
# JSON files
[*.json]
indent_size = 2
# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# Suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
# Prefix private members with underscore
dotnet_naming_rule.private_members_with_underscore.symbols = private_members
dotnet_naming_rule.private_members_with_underscore.style = underscore_prefix
dotnet_naming_rule.private_members_with_underscore.severity = suggestion
dotnet_naming_symbols.private_members.applicable_kinds = field
dotnet_naming_symbols.private_members.applicable_accessibilities = private
dotnet_naming_symbols.private_members.required_modifiers = readonly
dotnet_naming_style.underscore_prefix.capitalization = camel_case
dotnet_naming_style.underscore_prefix.required_prefix = _
dotnet_naming_style.underscore_prefix.required_suffix =
dotnet_naming_style.underscore_prefix.word_separator =
# Async methods should have "Async" suffix
dotnet_naming_rule.async_methods_end_in_async.symbols = any_async_methods
dotnet_naming_rule.async_methods_end_in_async.style = end_in_async
dotnet_naming_rule.async_methods_end_in_async.severity = suggestion
dotnet_naming_symbols.any_async_methods.applicable_kinds = method
dotnet_naming_symbols.any_async_methods.applicable_accessibilities = *
dotnet_naming_symbols.any_async_methods.required_modifiers = async
dotnet_naming_style.end_in_async.required_prefix =
dotnet_naming_style.end_in_async.required_suffix = Async
dotnet_naming_style.end_in_async.capitalization = pascal_case
dotnet_naming_style.end_in_async.word_separator =
# CSharp code style settings:
[*.cs]
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Prefer method-like constructs to have a expression-body
csharp_style_expression_bodied_methods = true:none
csharp_style_expression_bodied_constructors = true:none
csharp_style_expression_bodied_operators = true:none
# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
# All files
[*]
guidelines = 120

63
.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>ad-hoc</string>
<key>provisioningProfiles</key>
<dict>
<key>com.8bit.bitwarden</key>
<string>Ad hoc: Bitwarden 2020</string>
<key>com.8bit.bitwarden.autofill</key>
<string>Ad hoc: Autofill 2020</string>
<key>com.8bit.bitwarden.find-login-action-extension</key>
<string>Ad hoc: Extension 2020</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>provisioningProfiles</key>
<dict>
<key>com.8bit.bitwarden</key>
<string>Dist: Bitwarden 2020</string>
<key>com.8bit.bitwarden.autofill</key>
<string>Dist: Autofill 2020</string>
<key>com.8bit.bitwarden.find-login-action-extension</key>
<string>Dist: Extension 2020</string>
</dict>
</dict>
</plist>

13
.github/scripts/android/build.ps1 vendored Normal file
View File

@@ -0,0 +1,13 @@
param (
[Parameter(Mandatory=$true)]
[string] $configuration
)
$rootPath = $env:GITHUB_WORKSPACE;
$androidPath = $($rootPath + "/src/Android/Android.csproj");
Write-Output "########################################"
Write-Output "##### Build $configuration Configuration"
Write-Output "########################################"
msbuild "$($androidPath)" "/p:Configuration=$configuration"

View File

@@ -0,0 +1,75 @@
$rootPath = $env:GITHUB_WORKSPACE;
$androidPath = $($rootPath + "/src/Android/Android.csproj");
$appPath = $($rootPath + "/src/App/App.csproj");
$androidManifest = $($rootPath + "/src/Android/Properties/AndroidManifest.xml");
Write-Output "########################################"
Write-Output "##### Clean Android and App"
Write-Output "########################################"
msbuild "$($androidPath)" "/t:Clean" "/p:Configuration=FDroid"
msbuild "$($appPath)" "/t:Clean" "/p:Configuration=FDroid"
Write-Output "########################################"
Write-Output "##### Backup project files"
Write-Output "########################################"
Copy-Item $androidManifest $($androidManifest + ".original");
Copy-Item $androidPath $($androidPath + ".original");
Copy-Item $appPath $($appPath + ".original");
Write-Output "########################################"
Write-Output "##### Cleanup Android Manifest"
Write-Output "########################################"
$xml=New-Object XML;
$xml.Load($androidManifest);
$nsAndroid=New-Object System.Xml.XmlNamespaceManager($xml.NameTable);
$nsAndroid.AddNamespace("android", "http://schemas.android.com/apk/res/android");
$firebaseReceiver1=$xml.SelectSingleNode(`
"/manifest/application/receiver[@android:name='com.google.firebase.iid.FirebaseInstanceIdInternalReceiver']", `
$nsAndroid);
$firebaseReceiver1.ParentNode.RemoveChild($firebaseReceiver1);
$firebaseReceiver2=$xml.SelectSingleNode(`
"/manifest/application/receiver[@android:name='com.google.firebase.iid.FirebaseInstanceIdReceiver']", `
$nsAndroid);
$firebaseReceiver2.ParentNode.RemoveChild($firebaseReceiver2);
$xml.Save($androidManifest);
Write-Output "########################################"
Write-Output "##### Uninstall from Android.csproj"
Write-Output "########################################"
$xml=New-Object XML;
$xml.Load($androidPath);
$ns=New-Object System.Xml.XmlNamespaceManager($xml.NameTable);
$ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI);
$firebaseNode=$xml.SelectSingleNode(`
"/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns);
$firebaseNode.ParentNode.RemoveChild($firebaseNode);
$safetyNetNode=$xml.SelectSingleNode(`
"/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.GooglePlayServices.SafetyNet']", $ns);
$safetyNetNode.ParentNode.RemoveChild($safetyNetNode);
$xml.Save($androidPath);
Write-Output "########################################"
Write-Output "##### Uninstall from App.csproj"
Write-Output "########################################"
$xml=New-Object XML;
$xml.Load($appPath);
$appCenterNode=$xml.SelectSingleNode("/Project/ItemGroup/PackageReference[@Include='Microsoft.AppCenter.Crashes']");
$appCenterNode.ParentNode.RemoveChild($appCenterNode);
$xml.Save($appPath);

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env bash
cd $GITHUB_WORKSPACE
mkdir dist
cp CNAME ./dist
cd store
chmod 600 fdroid/config.py fdroid/keystore.jks
mkdir -p temp/fdroid
TEMP_DIR="$GITHUB_WORKSPACE/store/temp/fdroid"
cd fdroid
echo "keypass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
echo "keystorepass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
echo "local_copy_dir=\"$TEMP_DIR\"" >>config.py
mkdir -p repo
curl -Lo repo/com.x8bit.bitwarden-fdroid.apk \
https://github.com/bitwarden/mobile/releases/download/$RELEASE_TAG_NAME/com.x8bit.bitwarden-fdroid.apk
fdroid update
fdroid server update
cd ..
rm -rf temp/fdroid/archive
mv -v temp/fdroid ../dist
cd fdroid
cp index.html btn.png qr.png ../../dist/fdroid
cd $GITHUB_WORKSPACE

View File

@@ -0,0 +1,22 @@
$rootPath = $env:GITHUB_WORKSPACE;
$decryptSecretPath = $($rootPath + "/.github/scripts/decrypt-secret.ps1");
$appKeystorePlayFilename = "app_play-keystore.jks";
$appKeystorePlayPath = $($rootPath + "/src/Android/$appKeystorePlayFilename");
$appKeystoreUploadFilename = "app_upload-keystore.jks";
$appKeystoreUploadPath = $($rootPath + "/src/Android/$appKeystoreUploadFilename");
$appKeystoreFdroidFilename = "app_fdroid-keystore.jks";
$appKeystoreFdroidPath = $($rootPath + "/src/Android/$appKeystoreFdroidFilename");
$googleServicesFilename = "google-services.json";
$googleServicesPath = $($rootPath + "/src/Android/$googleServicesFilename");
Invoke-Expression `
"& `"$decryptSecretPath`" -filename $($appKeystorePlayFilename + ".gpg") -output $($appKeystorePlayPath)"
Invoke-Expression `
"& `"$decryptSecretPath`" -filename $($appKeystoreUploadFilename + ".gpg") -output $($appKeystoreUploadPath)"
Invoke-Expression `
"& `"$decryptSecretPath`" -filename $($appKeystoreFdroidFilename + ".gpg") -output $($appKeystoreFdroidPath)"
Invoke-Expression `
"& `"$decryptSecretPath`" -filename $($googleServicesFilename + ".gpg") -output $($googleServicesPath)"
Invoke-Expression "& `"$decryptSecretPath`" -filename play_creds.json.gpg"

View File

@@ -0,0 +1,9 @@
$rootPath = $env:GITHUB_WORKSPACE;
$homePath = Resolve-Path "~" | Select-Object -ExpandProperty Path;
$publisherPath = $($rootPath + "/store/google/Publisher/bin/Release/netcoreapp2.0/Publisher.dll");
$credsPath = $($homePath + "/secrets/play_creds.json");
$aabPath = $($rootPath + "/com.x8bit.bitwarden.aab");
$track = "alpha";
dotnet $publisherPath $credsPath $aabPath $track

View File

@@ -0,0 +1,16 @@
$rootPath = $env:GITHUB_WORKSPACE;
$buildNumber = 3000 + [int]$env:GITHUB_RUN_NUMBER;
Write-Output "########################################"
Write-Output "##### Setting Version Code $buildNumber"
Write-Output "########################################"
$androidManifest = $($rootPath + "/src/Android/Properties/AndroidManifest.xml");
$xml=New-Object XML;
$xml.Load($androidManifest);
$node=$xml.SelectNodes("/manifest");
$node.SetAttribute("android:versionCode", [string]$buildNumber);
$xml.Save($androidManifest);

23
.github/scripts/android/sign-fdroid.ps1 vendored Normal file
View File

@@ -0,0 +1,23 @@
$rootPath = $env:GITHUB_WORKSPACE;
$androidPath = $($rootPath + "/src/Android/Android.csproj");
$appKeystoreFdroidFilename = "app_fdroid-keystore.jks";
Write-Output "########################################"
Write-Output "##### Sign FDroid Configuration"
Write-Output "########################################"
msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=FDroid" "/p:AndroidKeyStore=true" `
"/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:FDROID_KEYSTORE_PASSWORD)" `
"/p:AndroidSigningKeyStore=$($appKeystoreFdroidFilename)" `
"/p:AndroidSigningStorePass=$($env:FDROID_KEYSTORE_PASSWORD)" "/v:quiet"
Write-Output "########################################"
Write-Output "##### Copy FDroid apk to project root"
Write-Output "########################################"
$signedApkPath = $($rootPath + "/src/Android/bin/FDroid/com.x8bit.bitwarden-Signed.apk");
$signedApkDestPath = $($rootPath + "/com.x8bit.bitwarden-fdroid.apk");
Copy-Item $signedApkPath $signedApkDestPath

42
.github/scripts/android/sign-play.ps1 vendored Normal file
View File

@@ -0,0 +1,42 @@
$rootPath = $env:GITHUB_WORKSPACE;
$androidPath = $($rootPath + "/src/Android/Android.csproj");
$appKeystorePlayFilename = "app_play-keystore.jks";
$appKeystoreUploadFilename = "app_upload-keystore.jks";
Write-Output "########################################"
Write-Output "##### Sign Google Play Bundle Release Configuration"
Write-Output "########################################"
msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=Release" "/p:AndroidKeyStore=true" `
"/p:AndroidSigningKeyAlias=upload" "/p:AndroidSigningKeyPass=$($env:UPLOAD_KEYSTORE_PASSWORD)" `
"/p:AndroidSigningKeyStore=$($appKeystoreUploadFilename)" `
"/p:AndroidSigningStorePass=$($env:UPLOAD_KEYSTORE_PASSWORD)" "/p:AndroidPackageFormat=aab" "/v:quiet"
Write-Output "########################################"
Write-Output "##### Copy Google Play Bundle to project root"
Write-Output "########################################"
$signedAabPath = $($rootPath + "/src/Android/bin/Release/com.x8bit.bitwarden-Signed.aab");
$signedAabDestPath = $($rootPath + "/com.x8bit.bitwarden.aab");
Copy-Item $signedAabPath $signedAabDestPath
Write-Output "########################################"
Write-Output "##### Sign APK Release Configuration"
Write-Output "########################################"
msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=Release" "/p:AndroidKeyStore=true" `
"/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:PLAY_KEYSTORE_PASSWORD)" `
"/p:AndroidSigningKeyStore=$($appKeystorePlayFilename)" `
"/p:AndroidSigningStorePass=$($env:PLAY_KEYSTORE_PASSWORD)" "/v:quiet"
Write-Output "########################################"
Write-Output "##### Copy Release APK to project root"
Write-Output "########################################"
$signedApkPath = $($rootPath + "/src/Android/bin/Release/com.x8bit.bitwarden-Signed.apk");
$signedApkDestPath = $($rootPath + "/com.x8bit.bitwarden.apk");
Copy-Item $signedApkPath $signedApkDestPath

29
.github/scripts/decrypt-secret.ps1 vendored Normal file
View File

@@ -0,0 +1,29 @@
param (
[Parameter(Mandatory=$true)]
[string] $filename,
[string] $output
)
$homePath = Resolve-Path "~" | Select-Object -ExpandProperty Path
$rootPath = $env:GITHUB_WORKSPACE
$secretInputPath = $rootPath + "/.github/secrets"
$input = $secretInputPath + "/" + $filename
$passphrase = $env:DECRYPT_FILE_PASSWORD
$secretOutputPath = $homePath + "/secrets"
if ([string]::IsNullOrEmpty($output)) {
if ($filename.EndsWith(".gpg")) {
$output = $secretOutputPath + "/" + $filename.TrimEnd(".gpg")
} else {
$output = $secretOutputPath + "/" + $filename + ".plaintext"
}
}
if (!(Test-Path -Path $secretOutputPath))
{
New-Item -ItemType Directory -Path $secretOutputPath
}
gpg --quiet --batch --yes --decrypt --passphrase="$passphrase" --output $output $input

29
.github/scripts/ios/build.ps1 vendored Normal file
View File

@@ -0,0 +1,29 @@
param (
[Parameter(Mandatory=$true)]
[string] $configuration,
[string] $platform = "iPhone",
[switch] $archive
)
$rootPath = $env:GITHUB_WORKSPACE;
$iosPath = $($rootPath + "/src/iOS/iOS.csproj");
if ($archive)
{
Write-Output "########################################"
Write-Output "##### Archive $configuration Configuration for $platform Platform"
Write-Output "########################################"
msbuild "$($iosPath)" "/p:Platform=$platform" "/p:Configuration=$configuration" `
"/p:ArchiveOnBuild=true" "/t:`"Build`""
Write-Output "########################################"
Write-Output "##### Done"
Write-Output "########################################"
ls ~/Library/Developer/Xcode/Archives
} else
{
Write-Output "########################################"
Write-Output "##### Build $configuration Configuration for $platform Platform"
Write-Output "########################################"
msbuild "$($iosPath)" "/p:Platform=$platform" "/p:Configuration=$configuration" "/t:`"Build`""
}

View File

@@ -0,0 +1,9 @@
$rootPath = $env:GITHUB_WORKSPACE;
$decryptSecretPath = $($rootPath + "/.github/scripts/decrypt-secret.ps1");
Invoke-Expression "& `"$decryptSecretPath`" -filename bitwarden-mobile-key.p12.gpg"
Invoke-Expression "& `"$decryptSecretPath`" -filename iphone-distribution-cert.p12.gpg"
Invoke-Expression "& `"$decryptSecretPath`" -filename dist_autofill.mobileprovision.gpg"
Invoke-Expression "& `"$decryptSecretPath`" -filename dist_bitwarden.mobileprovision.gpg"
Invoke-Expression "& `"$decryptSecretPath`" -filename dist_extension.mobileprovision.gpg"

View File

@@ -0,0 +1,5 @@
$rootPath = $env:GITHUB_WORKSPACE;
$ipaPath = "$rootPath/bitwarden-export/Bitwarden.ipa"
xcrun altool --upload-app --type ios --file "$ipaPath" `
--username "$env:APPLE_ID_USERNAME" --password "$env:APPLE_ID_PASSWORD"

13
.github/scripts/ios/export-ipa.ps1 vendored Normal file
View File

@@ -0,0 +1,13 @@
param (
[Parameter(Mandatory=$true)]
[string] $method
)
$rootPath = $env:GITHUB_WORKSPACE;
$homePath = Resolve-Path "~" | Select-Object -ExpandProperty Path
$exportOptionsPath = "$rootPath/.github/resources/export-options-$method.plist";
$archivePath = "$homePath/Library/Developer/Xcode/Archives/*/*.xcarchive";
$exportPath = "$rootPath/bitwarden-export";
xcodebuild -exportArchive -archivePath $archivePath -exportPath $exportPath -exportOptionsPlist $exportOptionsPath

View File

@@ -0,0 +1,26 @@
$rootPath = $env:GITHUB_WORKSPACE;
$buildNumber = 100 + [int]$env:GITHUB_RUN_NUMBER;
$bitwardenInfo = $($rootPath + "/src/iOS/Info.plist");
$extensionInfo = $($rootPath + "/src/iOS.Extension/Info.plist");
$autofillInfo = $($rootPath + "/src/iOS.Autofill/Info.plist");
Write-Output "########################################"
Write-Output "##### Setting CFBundleVersion $buildNumber"
Write-Output "########################################"
function Update-Version($file) {
$xml=New-Object XML;
$xml.Load($file);
Select-Xml -xml $xml -XPath "//dict/key[. = 'CFBundleVersion']/following-sibling::string[1]" |
%{
$_.Node.InnerXml = $buildNumber
}
$xml.Save($file);
}
Update-Version $bitwardenInfo
Update-Version $extensionInfo
Update-Version $autofillInfo

13
.github/scripts/ios/setup-keychain.ps1 vendored Normal file
View File

@@ -0,0 +1,13 @@
$homePath = Resolve-Path "~" | Select-Object -ExpandProperty Path;
$secretsPath = $homePath + "/secrets"
$mobileKeyPath = $($secretsPath + "/bitwarden-mobile-key.p12");
$distCertPath = $($secretsPath + "/iphone-distribution-cert.p12");
security create-keychain -p $env:KEYCHAIN_PASSWORD build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p $env:KEYCHAIN_PASSWORD build.keychain
security set-keychain-settings -lut 1200 build.keychain
security import $mobileKeyPath -k build.keychain -P $env:MOBILE_KEY_PASSWORD -T /usr/bin/codesign -T /usr/bin/security
security import $distCertPath -k build.keychain -P $env:DIST_CERT_PASSWORD -T /usr/bin/codesign -T /usr/bin/security
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $env:KEYCHAIN_PASSWORD build.keychain

21
.github/scripts/ios/setup-profiles.ps1 vendored Normal file
View File

@@ -0,0 +1,21 @@
$homePath = Resolve-Path "~" | Select-Object -ExpandProperty Path;
$secretsPath = $homePath + "/secrets"
$autofillProfilePath = $($secretsPath + "/dist_autofill.mobileprovision");
$bitwardenProfilePath = $($secretsPath + "/dist_bitwarden.mobileprovision");
$extensionProfilePath = $($secretsPath + "/dist_extension.mobileprovision");
$profilesDirPath = "~/Library/MobileDevice/Provisioning Profiles"
if (!(Test-Path -Path $profilesDirPath))
{
New-Item -ItemType Directory -Path $profilesDirPath
}
$autofill_uuid = grep UUID -A1 -a $autofillProfilePath | grep -io "[-A-F0-9]\{36\}"
Copy-Item $autofillProfilePath -destination "$profilesDirPath/$autofill_uuid.mobileprovision"
$bitwarden_uuid = grep UUID -A1 -a $bitwardenProfilePath | grep -io "[-A-F0-9]\{36\}"
Copy-Item $bitwardenProfilePath -destination "$profilesDirPath/$bitwarden_uuid.mobileprovision"
$extension_uuid = grep UUID -A1 -a $extensionProfilePath | grep -io "[-A-F0-9]\{36\}"
Copy-Item $extensionProfilePath -destination "$profilesDirPath/$extension_uuid.mobileprovision"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
<EFBFBD>
 K<>Y#<23>(<28><><EFBFBD><EFBFBD>EI֐߄T?)l<><6C><EFBFBD><18><><10>"=<3D>|<7C>'e<><0E>m<EFBFBD>/~<7E><>' F<><46>><3E><><EFBFBD><EFBFBD>l<EFBFBD>b<EFBFBD>[<5B>+R<><52>iL<69><4C>"<22><><EFBFBD>~V:<3A><>p<EFBFBD>a<17>ڵel%8t<38><74><EFBFBD>y<<3C>n<EFBFBD><6E><EFBFBD>aU<61>w<16>JD<4A><44><1F><>We<57>9<EFBFBD><39><EFBFBD><EFBFBD><x8d<38>O<EFBFBD>j\<14>ד<EFBFBD><D793><EFBFBD>Vq<56><71>֋
Ǻ<EFBFBD>-<2D>#<23><><11><>]$<24>(<28>l,<2C>Br<42><02><>d<><64><EFBFBD>•a-<2D><><EFBFBD>:<3A><>:<3A><04>9b,!Em<02><19><>Qf<>D<EFBFBD>g<EFBFBD><06><0E>x(P<>ȡ~<7E>͹<EFBFBD><CDB9> <09><>[<06><>!:<3A>;f<><66>

Binary file not shown.

BIN
.github/secrets/play_creds.json.gpg vendored Normal file

Binary file not shown.

Binary file not shown.

299
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,299 @@
name: Build
on:
push:
branches-ignore:
- 'l10n_master'
- 'gh-pages'
release:
types:
- published
jobs:
cloc:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Set up cloc
run: |
sudo apt-get update
sudo apt-get -y install cloc
- name: Print lines of code
run: cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML
android:
runs-on: windows-latest
steps:
- name: Set up NuGet
uses: nuget/setup-nuget@v1
with:
nuget-version: 'latest'
- name: Set up MSBuild
uses: microsoft/setup-msbuild@v1.0.0
- name: Print environment
run: |
nuget help
msbuild -version
dotnet --info
Write-Output "GitHub ref: $env:GITHUB_REF"
Write-Output "GitHub event: $env:GITHUB_EVENT"
shell: pwsh
env:
GITHUB_REF: ${{ github.ref }}
GITHUB_EVENT: ${{ github.event_name }}
- name: Checkout repo
uses: actions/checkout@v2
- name: Decrypt secrets
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/android/decrypt-secrets.ps1
shell: pwsh
env:
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
- name: Increment version
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/android/increment-version.ps1
shell: pwsh
- name: Restore packages
run: nuget restore
- name: Build Play Store publisher
run: dotnet build ./store/google/Publisher/Publisher.csproj -p:Configuration=Release
- name: Build for Play Store
run: ./.github/scripts/android/build.ps1 -configuration Release
shell: pwsh
- name: Sign for Play Store
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/android/sign-play.ps1
shell: pwsh
env:
PLAY_KEYSTORE_PASSWORD: ${{ secrets.PLAY_KEYSTORE_PASSWORD }}
UPLOAD_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
- name: Upload Play Store .aab artifact
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
uses: actions/upload-artifact@v2
with:
name: com.x8bit.bitwarden.aab
path: ./com.x8bit.bitwarden.aab
- name: Upload Play Store .apk artifact
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
uses: actions/upload-artifact@v2
with:
name: com.x8bit.bitwarden.apk
path: ./com.x8bit.bitwarden.apk
- name: Clean for F-Droid
run: ./.github/scripts/android/clean-fdroid.ps1
shell: pwsh
- name: Restore packages
run: nuget restore
- name: Build for F-Droid
run: ./.github/scripts/android/build.ps1 -configuration FDroid
shell: pwsh
- name: Sign for F-Droid
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/android/sign-fdroid.ps1
shell: pwsh
env:
FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }}
- name: Upload F-Droid .apk artifact
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
uses: actions/upload-artifact@v2
with:
name: com.x8bit.bitwarden-fdroid.apk
path: ./com.x8bit.bitwarden-fdroid.apk
- name: Deploy to Play Store
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/android/deploy-play.ps1
shell: pwsh
- name: Upload release assets
if: github.event_name == 'release'
run: |
hub release edit `
-a ./com.x8bit.bitwarden.aab `
-a ./com.x8bit.bitwarden.apk `
-a ./com.x8bit.bitwarden-fdroid.apk `
-m "Version $($env:RELEASE_TAG_NAME.TrimStart('v'))" `
$env:RELEASE_TAG_NAME
shell: pwsh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
android-ubuntu:
runs-on: ubuntu-latest
needs: android
steps:
- name: Set up Node
if: github.event_name == 'release'
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: Set up F-Droid server
if: github.event_name == 'release'
run: |
sudo apt-get -qq update
sudo apt-get -qqy install --no-install-recommends fdroidserver wget
- name: Set up git credentials
if: github.event_name == 'release'
env:
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
run: |
git config --global credential.helper store
echo "https://${ACCESS_TOKEN}:x-oauth-basic@github.com" >> ~/.git-credentials
git config --global user.email "ci@bitwarden.com"
git config --global user.name "Bitwarden CI"
- name: Print environment
if: github.event_name == 'release'
run: |
node --version
npm --version
git --version
Write-Output "GitHub ref: $env:GITHUB_REF"
Write-Output "GitHub event: $env:GITHUB_EVENT"
shell: pwsh
env:
GITHUB_REF: ${{ github.ref }}
GITHUB_EVENT: ${{ github.event_name }}
- name: Checkout repo
if: github.event_name == 'release'
uses: actions/checkout@v2
- name: Install Node dependencies
if: github.event_name == 'release'
run: npm install
- name: Decrypt secrets
if: github.event_name == 'release'
run: |
./.github/scripts/decrypt-secret.ps1 -filename store_fdroid-keystore.jks.gpg `
-output ./store/fdroid/keystore.jks
shell: pwsh
env:
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
- name: Compile for F-Droid Store
if: github.event_name == 'release'
run: |
sudo chmod +x ./.github/scripts/android/compile-fdroid.sh
./.github/scripts/android/compile-fdroid.sh
env:
FDROID_STORE_KEYSTORE_PASSWORD: ${{ secrets.FDROID_STORE_KEYSTORE_PASSWORD }}
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
- name: Deploy to gh-pages
if: github.event_name == 'release'
run: npm run deploy
ios:
runs-on: macos-latest
steps:
- name: Print environment
run: |
nuget help
msbuild -version
dotnet --info
Write-Output "GitHub ref: $env:GITHUB_REF"
Write-Output "GitHub event: $env:GITHUB_EVENT"
shell: pwsh
env:
GITHUB_REF: ${{ github.ref }}
GITHUB_EVENT: ${{ github.event_name }}
- name: Checkout repo
uses: actions/checkout@v2
- name: Decrypt secrets
run: ./.github/scripts/ios/decrypt-secrets.ps1
shell: pwsh
env:
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
- name: Increment version
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/ios/increment-version.ps1
shell: pwsh
- name: Set up keychain
run: ./.github/scripts/ios/setup-keychain.ps1
shell: pwsh
env:
KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }}
MOBILE_KEY_PASSWORD: ${{ secrets.IOS_KEY_PASSWORD }}
DIST_CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }}
- name: Set up provisioning profiles
run: ./.github/scripts/ios/setup-profiles.ps1
shell: pwsh
- name: Restore packages
run: nuget restore
- name: Archive Build for App Store
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/ios/build.ps1 -configuration AppStore -platform iPhone -archive
shell: pwsh
- name: Build for App Store
if: github.ref != 'refs/heads/master'
run: ./.github/scripts/ios/build.ps1 -configuration AppStore -platform iPhone
shell: pwsh
- name: Export .ipa for App Store
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/ios/export-ipa.ps1 -method app-store
shell: pwsh
- name: Upload App Store .ipa artifact
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
uses: actions/upload-artifact@v2
with:
name: Bitwarden.ipa
path: ./bitwarden-export/Bitwarden.ipa
- name: Deploy to App Store
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
run: ./.github/scripts/ios/deploy-app-store.ps1
shell: pwsh
env:
APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
- name: Upload release assets
if: github.event_name == 'release'
run: |
hub release edit `
-a ./bitwarden-export/Bitwarden.ipa `
-m "Version $($env:RELEASE_TAG_NAME.TrimStart('v'))" `
$env:RELEASE_TAG_NAME
shell: pwsh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}

21
.gitignore vendored
View File

@@ -1,15 +1,28 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# Visual Studio (>=2015) project-specific, machine local files
.vs/
# JetBrains Rider project-specific, machine local files
.idea
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# ignore Xamarin.Android Resource.Designer.cs files
**/*.Droid/**/[Rr]esource.[Dd]esigner.cs
**/*.Android/**/[Rr]esource.[Dd]esigner.cs
**/Android/**/[Rr]esource.[Dd]esigner.cs
**/Droid/**/[Rr]esource.[Dd]esigner.cs
# Xamarin Components
Components/
# Build results
[Dd]ebug/
[Dd]ebugPublic/
@@ -22,9 +35,6 @@ bld/
[Bb]in/
[Oo]bj/
# Visual Studo 2015 cache/options directory
.vs/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
@@ -198,3 +208,4 @@ FakesAssemblies/
# Other
project.lock.json
.DS_Store
src/App/Css

1
CNAME Normal file
View File

@@ -0,0 +1 @@
mobileapp.bitwarden.com

13
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,13 @@
Code contributions are welcome! Please commit any pull requests against the `master` branch.
# Localization (l10n)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/bitwarden-mobile/localized.svg)](https://crowdin.com/project/bitwarden-mobile)
We use a translation tool called [Crowdin](https://crowdin.com) to help manage our localization efforts across many different languages.
If you are interested in helping translate the Bitwarden mobile app into another language (or make a translation correction), please register an account at Crowdin and join our project here: https://crowdin.com/project/bitwarden-mobile
If the language that you are interested in translating is not already listed, create a new account on Crowdin, join the project, and contact the project owner (https://crowdin.com/profile/kspearrin).
You can read Crowdin's getting started guide for translators here: https://support.crowdin.com/crowdin-intro/

53
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,53 @@
<!-- Comment:
Please do not submit feature requests. The [Community Forums][1] has a
section for submitting, voting for, and discussing product feature requests.
[1]: https://community.bitwarden.com
-->
## Describe the Bug
<!-- Comment:
A clear and concise description of what the bug is.
-->
## Steps To Reproduce
<!-- Comment:
How can we reproduce the behavior:
-->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. Click on '...'
## Expected Result
<!-- Comment:
A clear and concise description of what you expected to happen.
-->
## Actual Result
<!-- Comment:
A clear and concise description of what is happening.
-->
## Screenshots or Videos
<!-- Comment:
If applicable, add screenshots and/or a short video to help explain your problem.
-->
## Environment
- Device: [e.g. iPhone6]
- Operating system: [e.g. iOS 8.1]
- Build Version (go to "Settings" → "About" in the app): [e.g. 2.3.0 (2221)]
- Is this a Beta release? [Y/N]
## Additional Context
<!-- Comment:
Add any other context about the problem here.
-->

View File

@@ -1,14 +1,31 @@
[![appveyor build](https://ci.appveyor.com/api/projects/status/github/bitwarden/mobile?branch=master&svg=true)](https://ci.appveyor.com/project/bitwarden/mobile)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/bitwarden-mobile/localized.svg)](https://crowdin.com/project/bitwarden-mobile)
[![Join the chat at https://gitter.im/bitwarden/Lobby](https://badges.gitter.im/bitwarden/Lobby.svg)](https://gitter.im/bitwarden/Lobby)
# bitwarden mobile
# Bitwarden Mobile Application
<a href="https://play.google.com/store/apps/details?id=com.x8bit.bitwarden" target="_blank"><img alt="Get it on Google Play" src="https://developer.android.com/images/brand/en_generic_rgb_wo_45.png"width="129" height="45"></a> <a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8" target="_blank"><img src="https://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg" width="165" height="40"></a>
<a href="https://play.google.com/store/apps/details?id=com.x8bit.bitwarden" target="_blank"><img alt="Get it on Google Play" src="https://imgur.com/YQzmZi9.png" width="153" height="46"></a> <a href="https://mobileapp.bitwarden.com/fdroid/" target="_blank"><img alt="Get it on Google Play" src="https://i.imgur.com/HDicnzz.png" width="154" height="46"></a> <a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8" target="_blank"><img src="https://imgur.com/GdGqPMY.png" width="135" height="40"></a>
The bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.
The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.
<img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-android-myvault.png" alt="" width="300" height="533" /> <img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-ios-myvault.png" alt="" width="300" height="533" />
# Build/Run
**Requirements**
- [Visual Studio](https://visualstudio.microsoft.com/)
- [Xamarin](https://docs.microsoft.com/en-us/xamarin/get-started/installation/?pivots=windows)
**Run the app**
- Open the solution file in Visual Studio.
- Restore the nuget packages.
- Build and run the app.
# Contribute
Code contributions are welcome! Visual Studio or Xamarin Studio is required to work on this project. Please commit any pull requests against the `master` branch.
Code contributions are welcome! Visual Studio with Xamarin is required to work on this project. Please commit any pull requests against the `master` branch.
Learn more about how to contribute by reading the [`CONTRIBUTING.md`](CONTRIBUTING.md) file.
Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature.
Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file.

45
SECURITY.md Normal file
View File

@@ -0,0 +1,45 @@
Bitwarden believes that working with security researchers across the globe is crucial to keeping our
users safe. If you believe you've found a security issue in our product or service, we encourage you to
notify us. We welcome working with you to resolve the issue promptly. Thanks in advance!
# Disclosure Policy
- Let us know as soon as possible upon discovery of a potential security issue, and we'll make every
effort to quickly resolve the issue.
- Provide us a reasonable amount of time to resolve the issue before any disclosure to the public or a
third-party. We may publicly disclose the issue before resolving it, if appropriate.
- Make a good faith effort to avoid privacy violations, destruction of data, and interruption or
degradation of our service. Only interact with accounts you own or with explicit permission of the
account holder.
- If you would like to encrypt your report, please use the PGP key with long ID
`0xDE6887086F892325FEC04CC0D847525B6931381F` (available in the public keyserver pool).
# In-scope
- Security issues in any current release of Bitwarden. This includes the web vault, browser extension,
and mobile apps (iOS and Android). Product downloads are available at https://bitwarden.com. Source
code is available at https://github.com/bitwarden.
# Exclusions
The following bug classes are out-of scope:
- Bugs that are already reported on any of Bitwarden's issue trackers (https://github.com/bitwarden),
or that we already know of. Note that some of our issue tracking is private.
- Issues in an upstream software dependency (ex: Xamarin, ASP.NET) which are already reported to the
upstream maintainer.
- Attacks requiring physical access to a user's device.
- Self-XSS
- Issues related to software or protocols not under Bitwarden's control
- Vulnerabilities in outdated versions of Bitwarden
- Missing security best practices that do not directly lead to a vulnerability
- Issues that do not have any impact on the general public
While researching, we'd like to ask you to refrain from:
- Denial of service
- Spamming
- Social engineering (including phishing) of Bitwarden staff or contractors
- Any physical attempts against Bitwarden property or data centers
Thank you for helping keep Bitwarden and our users safe!

146
appveyor.yml Normal file
View File

@@ -0,0 +1,146 @@
image:
- Visual Studio 2019
- Ubuntu1804
branches:
except:
- l10n_master
- gh-pages
configuration: Release
stack: node 10
init:
- sh: |
if [ "${DEBUG_SSH}" == "true" ]
then
curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
fi
- ps: |
if($isWindows -and $env:DEBUG_RDP -eq "true") {
iex ((new-object net.webclient).DownloadString(`
'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
}
- ps: |
if($env:APPVEYOR_REPO_TAG -eq "true") {
$tagName = $env:APPVEYOR_REPO_TAG_NAME.TrimStart("v")
$env:RELEASE_NAME = "Version ${tagName}"
}
install:
- sh: |
curl -sflL 'https://raw.githubusercontent.com/appveyor/secure-file/master/install.sh' | bash -e -
./appveyor-tools/secure-file -decrypt ./store/fdroid/keystore.jks.enc -secret $FDROID_KEYSTORE_ENC_PASSWORD
- sh: npm install
- sh: |
sudo apt-get -qq update
sudo apt-get -qqy install --no-install-recommends fdroidserver wget
- sh: |
if [ "${APPVEYOR_REPO_TAG}" == "true" -a "${GH_TOKEN}" != "" ]
then
git config --global credential.helper store
echo "https://${GH_TOKEN}:x-oauth-basic@github.com" >> ~/.git-credentials
git config --global user.email "ci@bitwarden.com"
git config --global user.name "Bitwarden CI"
fi
- cmd: choco install cloc --no-progress
- cmd: "cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML"
#- cmd: appveyor DownloadFile https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
#- cmd: appveyor DownloadFile https://aka.ms/vs/15/release/vs_community.exe
#- cmd: vs_community.exe update --wait --quiet --norestart --installPath "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community"
#- cmd: ps: .\src\Android\update-android.ps1
before_build:
- ps: |
if($isWindows) {
nuget restore
if($env:UPLOAD_KEYSTORE_DEC_SECRET -or$env:KEYSTORE_DEC_SECRET -or $env:GOOGLE_SERVICES_DEC_SECRET -or $env:PLAY_DEC_SECRET) {
nuget install secure-file -ExcludeVersion
}
if($env:GOOGLE_SERVICES_DEC_SECRET) {
secure-file\tools\secure-file -decrypt src\Android\google-services.json.enc `
-secret $env:GOOGLE_SERVICES_DEC_SECRET
}
}
build_script:
- sh: |
if [ "${APPVEYOR_REPO_TAG}" == "true" ]
then
mkdir dist
cp CNAME ./dist
cd store
chmod 600 fdroid/config.py fdroid/keystore.jks
mkdir -p temp/fdroid
TEMP_DIR="$APPVEYOR_BUILD_FOLDER/store/temp/fdroid"
cd fdroid
echo "keypass=\"$FDROID_KEYSTORE_PASSWORD\"" >>config.py
echo "keystorepass=\"$FDROID_KEYSTORE_PASSWORD\"" >>config.py
echo "local_copy_dir=\"$TEMP_DIR\"" >>config.py
mkdir -p repo
curl -Lo repo/com.x8bit.bitwarden-fdroid.apk \
https://github.com/bitwarden/mobile/releases/download/$APPVEYOR_REPO_TAG_NAME/com.x8bit.bitwarden-fdroid.apk
fdroid update
fdroid server update
cd ..
rm -rf temp/fdroid/archive
mv -v temp/fdroid ../dist
cd fdroid
cp index.html btn.png qr.png ../../dist/fdroid
cd $APPVEYOR_BUILD_FOLDER
fi
- ps: |
if($isWindows -and $env:KEYSTORE_DEC_SECRET) {
msbuild bitwarden-mobile.sln `
"/logger:C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" `
"/p:Configuration=Release"
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
.\src\Android\ci-build-apks.ps1
if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
Push-AppveyorArtifact .\com.x8bit.bitwarden.aab
Push-AppveyorArtifact .\com.x8bit.bitwarden.apk
Push-AppveyorArtifact .\com.x8bit.bitwarden-fdroid.apk
}
on_success:
- sh: |
if [ "${APPVEYOR_REPO_TAG}" == "true" -a "${GH_TOKEN}" != "" ]
then
npm run deploy
fi
- ps: |
if($isWindows -and $env:PLAY_DEC_SECRET -and $env:APPVEYOR_REPO_BRANCH -eq 'master') {
secure-file\tools\secure-file -decrypt store\google\Publisher\play_creds.json.enc -secret $env:PLAY_DEC_SECRET
cd store\google\Publisher\bin\Release\netcoreapp2.0
dotnet Publisher.dll `
$env:APPVEYOR_BUILD_FOLDER\store\google\Publisher\play_creds.json `
$env:APPVEYOR_BUILD_FOLDER\com.x8bit.bitwarden.aab `
alpha
cd $env:APPVEYOR_BUILD_FOLDER
}
on_finish:
- sh: |
if [ "${DEBUG_SSH}" == "true" ]
then
export APPVEYOR_SSH_BLOCK=true
curl -sflL 'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-ssh.sh' | bash -e -
fi
- ps: |
if($isWindows -and $env:DEBUG_RDP -eq "true") {
$blockRdp = $true
iex ((new-object net.webclient).DownloadString(`
'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
}
deploy:
tag: $(APPVEYOR_REPO_TAG_NAME)
release: $(RELEASE_NAME)
provider: GitHub
auth_token: $(GH_TOKEN)
artifact: /.*/
force_update: true
on:
branch: master
APPVEYOR_REPO_TAG: true

View File

@@ -1,428 +1,373 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
# Visual Studio Version 16
VisualStudioVersion = 16.0.29009.5
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "src\Android\Android.csproj", "{04B18ED2-B76D-4947-8474-191F8FD2B5E0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "src\Android\Android.csproj", "{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "src\iOS\iOS.csproj", "{1F78403F-9A28-405B-9289-B9DBEB55F074}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "src\App\App.csproj", "{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "src\App\App.csproj", "{B490C5DA-639E-4994-ABD2-54222B8A348E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "src\Core\Core.csproj", "{4B8A8C41-9820-4341-974C-41E65B7F4366}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Playground", "test\Playground\Playground.csproj", "{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EC730FD9-F623-4B6C-B503-95CDCFBCF277}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D10CA4A9-F866-40E1-B658-F69051236C71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App.Test", "test\App.Test\App.Test.csproj", "{A300DCE1-8D10-4267-B96A-CB01AEB7C220}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{8904C536-C67D-420F-9971-51B26574C3AA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Extension", "src\iOS.Extension\iOS.Extension.csproj", "{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "store", "store", "{92470CBD-9047-4C3C-8EA3-D972D6622D84}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Core", "src\iOS.Core\iOS.Core.csproj", "{B2538ADA-B605-4D6F-ACD2-62A409680F84}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "google", "google", "{2E399654-26A2-46F6-B9CA-1B496A3F370A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Test", "test\iOS.Test\iOS.Test.csproj", "{6702027A-F726-4149-863E-7CB924674B9A}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{76690DFB-B7F4-4781-83E4-113FDC450AFE}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitignore = .gitignore
appveyor.yml = appveyor.yml
.github\workflows\build.yml = .github\workflows\build.yml
CONTRIBUTING.md = CONTRIBUTING.md
crowdin.yml = crowdin.yml
README.md = README.md
SECURITY.md = SECURITY.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android.Test", "test\Android.Test\Android.Test.csproj", "{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Publisher", "store\google\Publisher\Publisher.csproj", "{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Core", "src\iOS.Core\iOS.Core.csproj", "{E71F3053-056C-4381-9638-048ED73BDFF6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "src\iOS\iOS.csproj", "{599E0201-420A-4C3E-A7BA-5349F72E0B15}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Extension", "src\iOS.Extension\iOS.Extension.csproj", "{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Autofill", "src\iOS.Autofill\iOS.Autofill.csproj", "{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}"
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|iPhone = FDroid|iPhone
FDroid|iPhoneSimulator = FDroid|iPhoneSimulator
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|x64.Build.0 = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x64.Deploy.0 = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.ActiveCfg = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Build.0 = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Deploy.0 = Debug|Any CPU
{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|x64.Build.0 = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.ActiveCfg = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.Build.0 = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|Any CPU.ActiveCfg = Release|iPhone
{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
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|x64.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|Any CPU.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|ARM.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|ARM.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|iPhone.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|x64.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|x64.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|x86.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.AppStore|x86.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|ARM.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|iPhone.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|x64.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|x64.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|x86.ActiveCfg = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Debug|x86.Build.0 = Debug|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|Any CPU.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|ARM.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|ARM.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|iPhone.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|iPhone.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|x64.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|x64.Build.0 = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|x86.ActiveCfg = Release|Any CPU
{B490C5DA-639E-4994-ABD2-54222B8A348E}.Release|x86.Build.0 = Release|Any CPU
{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|x64.Build.0 = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.ActiveCfg = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.Build.0 = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.ActiveCfg = Release|Any CPU
{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|x64.Build.0 = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.ActiveCfg = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.Build.0 = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|Any CPU.ActiveCfg = Release|iPhone
{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|x64.Build.0 = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.ActiveCfg = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.Build.0 = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{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
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|ARM.ActiveCfg = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|iPhone.Build.0 = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|x64.ActiveCfg = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.AppStore|x86.ActiveCfg = AppStore|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|ARM.ActiveCfg = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|iPhone.ActiveCfg = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|iPhone.Build.0 = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|x64.ActiveCfg = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Debug|x86.ActiveCfg = Debug|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|Any CPU.ActiveCfg = Release|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|ARM.ActiveCfg = Release|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|iPhone.ActiveCfg = Release|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|iPhone.Build.0 = Release|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{6702027A-F726-4149-863E-7CB924674B9A}.Release|x64.ActiveCfg = Release|iPhone
{6702027A-F726-4149-863E-7CB924674B9A}.Release|x86.ActiveCfg = Release|iPhone
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x64.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|Any CPU.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|ARM.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|ARM.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|ARM.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhone.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhone.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x64.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x64.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x64.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x86.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x86.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.AppStore|x86.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|ARM.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|ARM.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|ARM.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhone.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|Any CPU.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|Any CPU.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|ARM.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|ARM.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|ARM.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhone.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhone.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhone.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x64.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x64.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x64.Deploy.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x86.ActiveCfg = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x86.Build.0 = Release|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Release|x86.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|Any CPU.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhone.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhone.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhone.Build.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|Any CPU.Deploy.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhone.Deploy.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.FDroid|iPhoneSimulator.Deploy.0 = FDroid|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|Any CPU.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|Any CPU.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhone.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhone.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhone.Deploy.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|Any CPU.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhone.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhone.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhone.Build.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|Any CPU.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|Any CPU.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhone.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhone.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhone.Deploy.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|Any CPU.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|iPhone.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|iPhone.Build.0 = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|Any CPU.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|iPhone.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|iPhone.Build.0 = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4B8A8C41-9820-4341-974C-41E65B7F4366}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|iPhone.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|iPhone.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|Any CPU.Build.0 = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|iPhone.ActiveCfg = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|iPhone.Build.0 = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|iPhone.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|iPhone.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|Any CPU.Build.0 = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|iPhone.ActiveCfg = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|iPhone.Build.0 = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|iPhone.Build.0 = AppStore|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|iPhone.ActiveCfg = Debug|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|iPhone.Build.0 = Debug|iPhone
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|iPhone.Build.0 = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|Any CPU.Build.0 = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|iPhone.ActiveCfg = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|iPhone.Build.0 = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{E71F3053-056C-4381-9638-048ED73BDFF6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.AppStore|iPhone.Build.0 = AppStore|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|iPhone.ActiveCfg = Debug|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|iPhone.Build.0 = Debug|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|iPhone.Deploy.0 = Debug|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.FDroid|Any CPU.ActiveCfg = FDroid|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.FDroid|iPhone.ActiveCfg = FDroid|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.FDroid|iPhone.Build.0 = FDroid|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.FDroid|iPhoneSimulator.Build.0 = FDroid|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Release|Any CPU.ActiveCfg = Release|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Release|iPhone.ActiveCfg = Release|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Release|iPhone.Build.0 = Release|iPhone
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{599E0201-420A-4C3E-A7BA-5349F72E0B15}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|Any CPU.Build.0 = AppStore|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|iPhone.Build.0 = AppStore|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|iPhone.ActiveCfg = Debug|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|iPhone.Build.0 = Debug|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|iPhone.Deploy.0 = Debug|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|Any CPU.ActiveCfg = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|Any CPU.Build.0 = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|iPhone.ActiveCfg = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|iPhone.Build.0 = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Release|Any CPU.ActiveCfg = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Release|iPhone.ActiveCfg = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Release|iPhone.Build.0 = Release|iPhone
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|Any CPU.Build.0 = AppStore|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|iPhone.Build.0 = AppStore|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|iPhone.ActiveCfg = Debug|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|iPhone.Build.0 = Debug|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|iPhone.Deploy.0 = Debug|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|Any CPU.ActiveCfg = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|Any CPU.Build.0 = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|iPhone.ActiveCfg = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|iPhone.Build.0 = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Release|Any CPU.ActiveCfg = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Release|iPhone.ActiveCfg = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Release|iPhone.Build.0 = Release|iPhone
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
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}
{B490C5DA-639E-4994-ABD2-54222B8A348E} = {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}
{6702027A-F726-4149-863E-7CB924674B9A} = {0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE} = {0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}
{304400AF-F0ED-40FA-B102-EA3C3EC43E4F} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{EE44C6A1-2A85-45FE-8D9B-BF1D5F88809C} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{4B8A8C41-9820-4341-974C-41E65B7F4366} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{9C8DA5A8-904D-466F-B9B0-1A4AB5A9AFC3} = {8904C536-C67D-420F-9971-51B26574C3AA}
{2E399654-26A2-46F6-B9CA-1B496A3F370A} = {92470CBD-9047-4C3C-8EA3-D972D6622D84}
{256F9E44-0AF5-4D97-A2F9-DA26080C0A5D} = {2E399654-26A2-46F6-B9CA-1B496A3F370A}
{E71F3053-056C-4381-9638-048ED73BDFF6} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{599E0201-420A-4C3E-A7BA-5349F72E0B15} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{324BE76C-38FA-4F11-8BB1-95C7B3B1B545} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A} = {D10CA4A9-F866-40E1-B658-F69051236C71}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7D436EA3-8B7E-45D2-8D14-0730BD2E0410}
EndGlobalSection
EndGlobal

31
crowdin.yml Normal file
View File

@@ -0,0 +1,31 @@
files:
- source: /src/App/Resources/AppResources.resx
translation: /src/App/Resources/AppResources.%two_letters_code%.resx
update_option: update_as_unapproved
languages_mapping:
two_letters_code:
zh-CN: zh-Hans
zh-TW: zh-Hant
pt-PT: pt-PT
pt-BR: pt-BR
en-GB: en-GB
- source: /store/apple/en/copy.resx
translation: /store/apple/%two_letters_code%/copy.resx
update_option: update_as_unapproved
languages_mapping:
two_letters_code:
zh-CN: zh-Hans
zh-TW: zh-Hant
pt-PT: pt-PT
pt-BR: pt-BR
en-GB: en-GB
- source: /store/google/en/copy.resx
translation: /store/google/%two_letters_code%/copy.resx
update_option: update_as_unapproved
languages_mapping:
two_letters_code:
zh-CN: zh-Hans
zh-TW: zh-Hant
pt-BR: pt-BR
pt-PT: pt-PT
en-GB: en-GB

344
package-lock.json generated Normal file
View File

@@ -0,0 +1,344 @@
{
"name": "bitwarden-mobile",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
"dev": true,
"requires": {
"array-uniq": "^1.0.1"
}
},
"array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
"dev": true
},
"async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
"dev": true,
"requires": {
"lodash": "^4.17.10"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"commander": {
"version": "2.15.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"filename-reserved-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
"integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=",
"dev": true
},
"filenamify": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
"integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
"dev": true,
"requires": {
"filename-reserved-regex": "^1.0.0",
"strip-outer": "^1.0.0",
"trim-repeated": "^1.0.0"
}
},
"filenamify-url": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz",
"integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=",
"dev": true,
"requires": {
"filenamify": "^1.0.0",
"humanize-url": "^1.0.0"
}
},
"fs-extra": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
"integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"gh-pages": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-1.2.0.tgz",
"integrity": "sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==",
"dev": true,
"requires": {
"async": "2.6.1",
"commander": "2.15.1",
"filenamify-url": "^1.0.0",
"fs-extra": "^5.0.0",
"globby": "^6.1.0",
"graceful-fs": "4.1.11",
"rimraf": "^2.6.2"
}
},
"glob": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"globby": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
"integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
"dev": true,
"requires": {
"array-union": "^1.0.1",
"glob": "^7.0.3",
"object-assign": "^4.0.1",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
"dev": true
},
"humanize-url": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz",
"integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=",
"dev": true,
"requires": {
"normalize-url": "^1.0.0",
"strip-url-auth": "^1.0.0"
}
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
"dev": true
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"normalize-url": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
"integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
"dev": true,
"requires": {
"object-assign": "^4.0.1",
"prepend-http": "^1.0.0",
"query-string": "^4.1.0",
"sort-keys": "^1.0.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
"dev": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
"pinkie": "^2.0.0"
}
},
"prepend-http": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
"dev": true
},
"query-string": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
"integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
"dev": true,
"requires": {
"object-assign": "^4.1.0",
"strict-uri-encode": "^1.0.0"
}
},
"rimraf": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
"integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
"dev": true,
"requires": {
"is-plain-obj": "^1.0.0"
}
},
"strict-uri-encode": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true
},
"strip-outer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
"integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.2"
}
},
"strip-url-auth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz",
"integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=",
"dev": true
},
"trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
"integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.2"
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}
}
}

11
package.json Normal file
View File

@@ -0,0 +1,11 @@
{
"name": "bitwarden-mobile",
"version": "0.0.0",
"scripts": {
"deploy": "gh-pages --dist dist",
"clean:l10n": "git push origin --delete l10n_master"
},
"devDependencies": {
"gh-pages": "^1.2.0"
}
}

Binary file not shown.

View File

@@ -0,0 +1,121 @@
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using System;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
namespace Bit.Droid.Accessibility
{
[Activity(Theme = "@style/LightTheme.Splash", WindowSoftInputMode = SoftInput.StateHidden)]
public class AccessibilityActivity : Activity
{
private DateTime? _lastLaunch = null;
private string _lastQueriedUri;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
HandleIntent(Intent, 932473);
}
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
HandleIntent(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)
{
AccessibilityHelpers.LastCredentials = null;
}
else
{
try
{
if (data.GetStringExtra("canceled") != null)
{
AccessibilityHelpers.LastCredentials = null;
}
else
{
var uri = data.GetStringExtra("uri");
var username = data.GetStringExtra("username");
var password = data.GetStringExtra("password");
AccessibilityHelpers.LastCredentials = new Credentials
{
Username = username,
Password = password,
Uri = uri,
LastUri = _lastQueriedUri
};
}
}
catch
{
AccessibilityHelpers.LastCredentials = null;
}
}
Finish();
}
private void HandleIntent(Intent callingIntent, int requestCode)
{
if (callingIntent?.GetBooleanExtra("autofillTileClicked", false) ?? false)
{
Intent.RemoveExtra("autofillTileClicked");
var messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
messagingService.Send("OnAutofillTileClick");
Finish();
}
else
{
LaunchMainActivity(callingIntent, requestCode);
}
}
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);
}
}
}

View File

@@ -0,0 +1,648 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Provider;
using Android.Runtime;
using Android.Views;
using Android.Views.Accessibility;
using Android.Widget;
using Bit.App.Resources;
using Bit.Core;
namespace Bit.Droid.Accessibility
{
public static class AccessibilityHelpers
{
public static Credentials LastCredentials = null;
public static string SystemUiPackage = "com.android.systemui";
public static string BitwardenTag = "bw_access";
public static bool IsAutofillTileAdded = false;
public static bool IsAccessibilityBroadcastReady = false;
// Be sure to keep these two sections sorted alphabetically
public static Dictionary<string, Browser> SupportedBrowsers => new List<Browser>
{
// [Section A] Entries also present in the list of Autofill Framework
//
// So keep them in sync with:
// - AutofillHelpers.{TrustedBrowsers,CompatBrowsers}
// - Resources/xml/autofillservice.xml
new Browser("com.amazon.cloud9", "url"),
new Browser("com.android.browser", "url"),
new Browser("com.android.chrome", "url_bar"),
new Browser("com.avast.android.secure.browser", "editor"),
new Browser("com.avg.android.secure.browser", "editor"),
new Browser("com.brave.browser", "url_bar"),
new Browser("com.brave.browser_beta", "url_bar"),
new Browser("com.brave.browser_default", "url_bar"),
new Browser("com.brave.browser_dev", "url_bar"),
new Browser("com.brave.browser_nightly", "url_bar"),
new Browser("com.chrome.beta", "url_bar"),
new Browser("com.chrome.canary", "url_bar"),
new Browser("com.chrome.dev", "url_bar"),
new Browser("com.duckduckgo.mobile.android", "omnibarTextInput"),
new Browser("com.ecosia.android", "url_bar"),
new Browser("com.google.android.apps.chrome", "url_bar"),
new Browser("com.google.android.apps.chrome_dev", "url_bar"),
new Browser("com.kiwibrowser.browser", "url_bar"),
new Browser("com.microsoft.emmx", "url_bar"),
new Browser("com.naver.whale", "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.mini.native.beta", "url_field"),
new Browser("com.opera.touch", "addressbarEdit"),
new Browser("com.qwant.liberty", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
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.stoutner.privacybrowser.free", "url_edittext"),
new Browser("com.stoutner.privacybrowser.standard", "url_edittext"),
new Browser("com.vivaldi.browser", "url_bar"),
new Browser("com.vivaldi.browser.snapshot", "url_bar"),
new Browser("com.vivaldi.browser.sopranos", "url_bar"),
new Browser("com.yandex.browser", "bro_omnibar_address_title_text,bro_omnibox_collapsed_title",
(s) => s.Split(new char[]{' ', ' '}).FirstOrDefault()), // 0 = Regular Space, 1 = No-break space (00A0)
new Browser("mark.via.gp", "aw"),
new Browser("org.adblockplus.browser", "url_bar,url_bar_title"), // 2nd = Legacy (before v2)
new Browser("org.adblockplus.browser.beta", "url_bar,url_bar_title"), // 2nd = Legacy (before v2)
new Browser("org.bromite.bromite", "url_bar"),
new Browser("org.bromite.chromium", "url_bar"),
new Browser("org.chromium.chrome", "url_bar"),
new Browser("org.codeaurora.swe.browser", "url_bar"),
new Browser("org.gnu.icecat", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.mozilla.fenix", "mozac_browser_toolbar_url_view"),
new Browser("org.mozilla.fenix.nightly", "mozac_browser_toolbar_url_view"),
new Browser("org.mozilla.fennec_aurora", "mozac_browser_toolbar_url_view,url_bar_title"), // 2nd = Legacy
new Browser("org.mozilla.fennec_fdroid", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.mozilla.firefox", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.mozilla.firefox_beta", "mozac_browser_toolbar_url_view,url_bar_title"), // 2nd = Legacy
new Browser("org.mozilla.focus", "display_url"),
new Browser("org.mozilla.klar", "display_url"),
new Browser("org.mozilla.reference.browser", "mozac_browser_toolbar_url_view"),
new Browser("org.mozilla.rocket", "display_url"),
new Browser("org.torproject.torbrowser", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.torproject.torbrowser_alpha", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.ungoogled.chromium", "url_bar"),
// [Section B] Entries only present here
//
// FIXME: Test the compatibility of these with Autofill Framework
new Browser("acr.browser.barebones", "search"),
new Browser("acr.browser.lightning", "search"),
new Browser("com.feedback.browser.wjbrowser", "addressbar_url"),
new Browser("com.ghostery.android.ghostery", "search_field"),
new Browser("com.htc.sense.browser", "title"),
new Browser("com.jerky.browser2", "enterUrl"),
new Browser("com.ksmobile.cb", "address_bar_edit_text"),
new Browser("com.linkbubble.playstore", "url_text"),
new Browser("com.mx.browser", "address_editor_with_progress"),
new Browser("com.mx.browser.tablet", "address_editor_with_progress"),
new Browser("com.nubelacorp.javelin", "enterUrl"),
new Browser("jp.co.fenrir.android.sleipnir", "url_text"),
new Browser("jp.co.fenrir.android.sleipnir_black", "url_text"),
new Browser("jp.co.fenrir.android.sleipnir_test", "url_text"),
new Browser("mobi.mgeek.TunnyBrowser", "title"),
new Browser("org.iron.srware", "url_bar"),
}.ToDictionary(n => n.PackageName);
// Known packages to skip
public static HashSet<string> FilteredPackageNames => new HashSet<string>
{
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",
"com.treydev.pns"
};
// Be sure to keep these entries sorted alphabetically
public static Dictionary<string, KnownUsernameField> KnownUsernameFields => new List<KnownUsernameField>
{
new KnownUsernameField("accounts.google.com", "ServiceLogin", "Email"),
new KnownUsernameField("amazon.com", "signin", "ap_email_login"),
new KnownUsernameField("github.com", "", "user[login]-footer"),
new KnownUsernameField("paypal.com", "signin", "email"),
new KnownUsernameField("signin.aws.amazon.com", "signin", "resolving_input"),
new KnownUsernameField("signin.ebay.com", "eBayISAPI.dll", "userid"),
}.ToDictionary(n => n.UriAuthority);
public static void PrintTestData(AccessibilityNodeInfo root, AccessibilityEvent e)
{
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 });
foreach (var node in testNodesData)
{
System.Diagnostics.Debug.WriteLine("Node: {0} = {1}", node.id, node.text);
}
}
public static string GetUri(AccessibilityNodeInfo root)
{
var uri = string.Concat(Constants.AndroidAppProtocol, root.PackageName);
if (SupportedBrowsers.ContainsKey(root.PackageName))
{
var browser = SupportedBrowsers[root.PackageName];
AccessibilityNodeInfo addressNode = null;
foreach (var uriViewId in browser.UriViewId.Split(","))
{
addressNode = root.FindAccessibilityNodeInfosByViewId(
$"{root.PackageName}:id/{uriViewId}").FirstOrDefault();
if (addressNode != null)
{
break;
}
}
if (addressNode != null)
{
uri = ExtractUri(uri, addressNode, browser);
addressNode.Recycle();
}
else
{
// Return null to prevent overwriting notification pendingIntent uri with browser packageName
// (we login to pages, not browsers)
return null;
}
}
return uri;
}
private static string ExtractUri(string uri, AccessibilityNodeInfo addressNode, Browser browser)
{
if (addressNode?.Text == null)
{
return uri;
}
if (addressNode.Text == null)
{
return uri;
}
uri = browser.GetUriFunction(addressNode.Text)?.Trim();
if (uri != null && uri.Contains("."))
{
var hasHttpProtocol = uri.StartsWith("http://") || uri.StartsWith("https://");
if (!hasHttpProtocol && uri.Contains("."))
{
if (Uri.TryCreate("http://" + uri, UriKind.Absolute, out var uri2))
{
return string.Concat("http://", uri);
}
}
if (Uri.TryCreate(uri, UriKind.Absolute, out var uri3))
{
return uri;
}
}
return uri;
}
/// <summary>
/// Check to make sure it is ok to autofill still on the current screen
/// </summary>
public static bool NeedToAutofill(Credentials credentials, string currentUriString)
{
if (credentials == null)
{
return false;
}
if (Uri.TryCreate(credentials.LastUri, UriKind.Absolute, out Uri lastUri) &&
Uri.TryCreate(currentUriString, UriKind.Absolute, out Uri currentUri))
{
return lastUri.Host == currentUri.Host;
}
return false;
}
public static bool EditText(AccessibilityNodeInfo n)
{
return n?.ClassName?.Contains("EditText") ?? false;
}
public static void FillCredentials(AccessibilityNodeInfo usernameNode,
IEnumerable<AccessibilityNodeInfo> passwordNodes)
{
FillEditText(usernameNode, LastCredentials?.Username);
foreach (var n in passwordNodes)
{
FillEditText(n, LastCredentials?.Password);
}
}
public static void FillEditText(AccessibilityNodeInfo editTextNode, string value)
{
if (editTextNode == null || value == null)
{
return;
}
var bundle = new Bundle();
bundle.PutString(AccessibilityNodeInfo.ActionArgumentSetTextCharsequence, value);
editTextNode.PerformAction(Android.Views.Accessibility.Action.SetText, bundle);
}
public static NodeList GetWindowNodes(AccessibilityNodeInfo n, AccessibilityEvent e,
Func<AccessibilityNodeInfo, bool> condition, bool disposeIfUnused, NodeList nodes = null,
int recursionDepth = 0)
{
if (nodes == null)
{
nodes = new NodeList();
}
var dispose = disposeIfUnused;
if (n != null && recursionDepth < 100)
{
var add = n.WindowId == e.WindowId &&
!(n.ViewIdResourceName?.StartsWith(SystemUiPackage) ?? false) &&
condition(n);
if (add)
{
dispose = false;
nodes.Add(n);
}
for (var i = 0; i < n.ChildCount; i++)
{
var childNode = n.GetChild(i);
if (childNode == null)
{
continue;
}
else if (i > 100)
{
Android.Util.Log.Info(BitwardenTag, "Too many child iterations.");
break;
}
else if (childNode.GetHashCode() == n.GetHashCode())
{
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?.Recycle();
n?.Dispose();
}
return nodes;
}
public static AccessibilityNodeInfo GetUsernameEditText(string uriString,
IEnumerable<AccessibilityNodeInfo> allEditTexts)
{
string uriAuthority = null;
string uriKey = null;
string uriLocalPath = null;
if (Uri.TryCreate(uriString, UriKind.Absolute, out var uri))
{
uriAuthority = uri.Authority;
uriKey = uriAuthority.StartsWith("www.") ? uriAuthority.Substring(4) : uriAuthority;
uriLocalPath = uri.LocalPath;
}
if (!string.IsNullOrEmpty(uriKey))
{
// Uncomment this to log values necessary for username field discovery
// foreach (var editText in allEditTexts)
// {
// System.Diagnostics.Debug.WriteLine(">>> uriKey: {0}, uriLocalPath: {1}, viewId: {2}", uriKey,
// uriLocalPath, editText.ViewIdResourceName);
// }
if (KnownUsernameFields.ContainsKey(uriKey))
{
var usernameField = KnownUsernameFields[uriKey];
if (uriLocalPath.EndsWith(usernameField.UriPathEnd))
{
foreach (var editText in allEditTexts)
{
foreach (var usernameViewId in usernameField.UsernameViewId.Split(","))
{
if (usernameViewId == editText.ViewIdResourceName)
{
return editText;
}
}
}
}
}
}
// no match found, attempt to establish username field based on password field
return GetUsernameEditTextIfPasswordExists(allEditTexts);
}
private static AccessibilityNodeInfo GetUsernameEditTextIfPasswordExists(
IEnumerable<AccessibilityNodeInfo> allEditTexts)
{
AccessibilityNodeInfo previousEditText = null;
foreach (var editText in allEditTexts)
{
if (editText.Password)
{
return previousEditText;
}
previousEditText = editText;
}
return null;
}
public static bool IsUsernameEditText(AccessibilityNodeInfo root, AccessibilityEvent e)
{
var allEditTexts = GetWindowNodes(root, e, n => EditText(n), false);
var uriString = GetUri(root);
var usernameEditText = GetUsernameEditText(uriString, allEditTexts);
var isUsernameEditText = false;
if (usernameEditText != null)
{
isUsernameEditText = IsSameNode(usernameEditText, e.Source);
}
allEditTexts.Dispose();
return isUsernameEditText;
}
public static bool IsSameNode(AccessibilityNodeInfo node1, AccessibilityNodeInfo node2)
{
if (node1 != null && node2 != null)
{
return node1.Equals(node2) || node1.GetHashCode() == node2.GetHashCode();
}
return false;
}
public static bool OverlayPermitted()
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
{
if (Settings.CanDrawOverlays(Application.Context))
{
return true;
}
var appOpsMgr = (AppOpsManager)Application.Context.GetSystemService(Context.AppOpsService);
var mode = appOpsMgr.CheckOpNoThrow("android:system_alert_window", Process.MyUid(),
Application.Context.PackageName);
if (mode == AppOpsManagerMode.Allowed || mode == AppOpsManagerMode.Ignored)
{
return true;
}
try
{
var wm = Application.Context.GetSystemService(Context.WindowService)
.JavaCast<IWindowManager>();
if (wm == null)
{
return false;
}
var testView = new View(Application.Context);
var layoutParams = GetOverlayLayoutParams();
wm.AddView(testView, layoutParams);
wm.RemoveView(testView);
return true;
}
catch { }
return false;
}
// older android versions are always true
return true;
}
public static LinearLayout GetOverlayView(Context context)
{
var inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
var view = (LinearLayout)inflater.Inflate(Resource.Layout.autofill_listitem, null);
var text1 = (TextView)view.FindViewById(Resource.Id.text1);
var text2 = (TextView)view.FindViewById(Resource.Id.text2);
var icon = (ImageView)view.FindViewById(Resource.Id.icon);
text1.Text = AppResources.AutofillWithBitwarden;
text2.Text = AppResources.GoToMyVault;
icon.SetImageResource(Resource.Drawable.icon);
return view;
}
public static WindowManagerLayoutParams GetOverlayLayoutParams()
{
WindowManagerTypes windowManagerType;
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
windowManagerType = WindowManagerTypes.ApplicationOverlay;
}
else
{
windowManagerType = WindowManagerTypes.Phone;
}
var layoutParams = new WindowManagerLayoutParams(
ViewGroup.LayoutParams.WrapContent,
ViewGroup.LayoutParams.WrapContent,
windowManagerType,
WindowManagerFlags.NotFocusable | WindowManagerFlags.NotTouchModal,
Format.Transparent);
layoutParams.Gravity = GravityFlags.Top | GravityFlags.Left;
return layoutParams;
}
public static Point GetOverlayAnchorPosition(AccessibilityService service, AccessibilityNodeInfo anchorView,
int overlayViewHeight, bool isOverlayAboveAnchor)
{
var anchorViewRect = new Rect();
anchorView.GetBoundsInScreen(anchorViewRect);
var anchorViewX = anchorViewRect.Left;
var anchorViewY = isOverlayAboveAnchor ? anchorViewRect.Top : anchorViewRect.Bottom;
anchorViewRect.Dispose();
if (isOverlayAboveAnchor)
{
anchorViewY -= overlayViewHeight;
}
anchorViewY -= GetStatusBarHeight(service);
return new Point(anchorViewX, anchorViewY);
}
public static Point GetOverlayAnchorPosition(AccessibilityService service, AccessibilityNodeInfo anchorNode,
AccessibilityNodeInfo root, IEnumerable<AccessibilityWindowInfo> windows, int overlayViewHeight,
bool isOverlayAboveAnchor)
{
Point point = null;
if (anchorNode != null)
{
// Update node's info since this is still a reference from an older event
anchorNode.Refresh();
if (!anchorNode.VisibleToUser)
{
return new Point(-1, -1);
}
if (!anchorNode.Focused)
{
return null;
}
// node.VisibleToUser doesn't always give us exactly what we want, so attempt to tighten up the range
// of visibility
var inputMethodHeight = 0;
if (windows != null)
{
if (IsStatusBarExpanded(windows))
{
return new Point(-1, -1);
}
inputMethodHeight = GetInputMethodHeight(windows);
}
var minY = 0;
var rootNodeHeight = GetNodeHeight(root);
if (rootNodeHeight == -1)
{
return null;
}
var maxY = rootNodeHeight - GetNavigationBarHeight(service) - GetStatusBarHeight(service) -
inputMethodHeight;
point = GetOverlayAnchorPosition(service, anchorNode, overlayViewHeight, isOverlayAboveAnchor);
if (point.Y < minY)
{
if (isOverlayAboveAnchor)
{
// view nearing bounds, anchor to bottom
point.X = -1;
point.Y = 0;
}
else
{
// view out of bounds, hide overlay
point.X = -1;
point.Y = -1;
}
}
else if (point.Y > (maxY - overlayViewHeight))
{
if (isOverlayAboveAnchor)
{
// view out of bounds, hide overlay
point.X = -1;
point.Y = -1;
}
else
{
// view nearing bounds, anchor to top
point.X = 0;
point.Y = -1;
}
}
else if (isOverlayAboveAnchor && point.Y < (maxY - (overlayViewHeight * 2) - GetNodeHeight(anchorNode)))
{
// This else block forces the overlay to return to bottom alignment as soon as space is available
// below the anchor view. Removing this will change the behavior to wait until there isn't enough
// space above the anchor view before returning to bottom alignment.
point.X = -1;
point.Y = 0;
}
}
return point;
}
public static bool IsStatusBarExpanded(IEnumerable<AccessibilityWindowInfo> windows)
{
if (windows != null && windows.Any())
{
var isSystemWindowsOnly = true;
foreach (var window in windows)
{
if (window.Type != AccessibilityWindowType.System)
{
isSystemWindowsOnly = false;
break;
}
}
return isSystemWindowsOnly;
}
return false;
}
public static int GetInputMethodHeight(IEnumerable<AccessibilityWindowInfo> windows)
{
var inputMethodWindowHeight = 0;
if (windows != null)
{
foreach (var window in windows)
{
if (window.Type == AccessibilityWindowType.InputMethod)
{
var windowRect = new Rect();
window.GetBoundsInScreen(windowRect);
inputMethodWindowHeight = windowRect.Height();
break;
}
}
}
return inputMethodWindowHeight;
}
public static bool IsAutofillServicePromptVisible(IEnumerable<AccessibilityWindowInfo> windows)
{
// Autofill framework not available until API 26
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
return windows?.Any(w => w.Title?.ToLower().Contains("autofill") ?? false) ?? false;
}
return false;
}
public static int GetNodeHeight(AccessibilityNodeInfo node)
{
if (node == null)
{
return -1;
}
var nodeRect = new Rect();
node.GetBoundsInScreen(nodeRect);
var nodeRectHeight = nodeRect.Height();
nodeRect.Dispose();
return nodeRectHeight;
}
private static int GetStatusBarHeight(AccessibilityService service)
{
return GetSystemResourceDimenPx(service, "status_bar_height");
}
private static int GetNavigationBarHeight(AccessibilityService service)
{
return GetSystemResourceDimenPx(service, "navigation_bar_height");
}
private static int GetSystemResourceDimenPx(AccessibilityService service, string resName)
{
var resourceId = service.Resources.GetIdentifier(resName, "dimen", "android");
if (resourceId > 0)
{
return service.Resources.GetDimensionPixelSize(resourceId);
}
return 0;
}
}
}

View File

@@ -0,0 +1,473 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Views.Accessibility;
using Android.Widget;
using Bit.App.Resources;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
namespace Bit.Droid.Accessibility
{
[Service(Permission = Android.Manifest.Permission.BindAccessibilityService, Label = "Bitwarden")]
[IntentFilter(new string[] { "android.accessibilityservice.AccessibilityService" })]
[MetaData("android.accessibilityservice", Resource = "@xml/accessibilityservice")]
[Register("com.x8bit.bitwarden.Accessibility.AccessibilityService")]
public class AccessibilityService : Android.AccessibilityServices.AccessibilityService
{
private const string BitwardenPackage = "com.x8bit.bitwarden";
private const string BitwardenWebsite = "vault.bitwarden.com";
private IStorageService _storageService;
private IBroadcasterService _broadcasterService;
private DateTime? _lastSettingsReload = null;
private TimeSpan _settingsReloadSpan = TimeSpan.FromMinutes(1);
private HashSet<string> _blacklistedUris;
private AccessibilityNodeInfo _anchorNode = null;
private int _lastAnchorX = 0;
private int _lastAnchorY = 0;
private bool _isOverlayAboveAnchor = false;
private static bool _overlayAnchorObserverRunning = false;
private IWindowManager _windowManager = null;
private LinearLayout _overlayView = null;
private int _overlayViewHeight = 0;
private long _lastAutoFillTime = 0;
private Java.Lang.Runnable _overlayAnchorObserverRunnable = null;
private Handler _handler = new Handler(Looper.MainLooper);
private HashSet<string> _launcherPackageNames = null;
private DateTime? _lastLauncherSetBuilt = null;
private TimeSpan _rebuildLauncherSpan = TimeSpan.FromHours(1);
public override void OnCreate()
{
base.OnCreate();
LoadServices();
var settingsTask = LoadSettingsAsync();
_broadcasterService.Subscribe(nameof(AccessibilityService), (message) =>
{
if (message.Command == "OnAutofillTileClick")
{
var runnable = new Java.Lang.Runnable(OnAutofillTileClick);
_handler.PostDelayed(runnable, 250);
}
});
AccessibilityHelpers.IsAccessibilityBroadcastReady = true;
}
public override void OnDestroy()
{
AccessibilityHelpers.IsAccessibilityBroadcastReady = false;
_broadcasterService.Unsubscribe(nameof(AccessibilityService));
}
public override void OnAccessibilityEvent(AccessibilityEvent e)
{
try
{
var powerManager = GetSystemService(PowerService) as PowerManager;
if (Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch && !powerManager.IsInteractive)
{
return;
}
else if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop && !powerManager.IsScreenOn)
{
return;
}
if (SkipPackage(e?.PackageName))
{
if (e?.PackageName != "com.android.systemui")
{
CancelOverlayPrompt();
}
return;
}
// AccessibilityHelpers.PrintTestData(RootInActiveWindow, e);
LoadServices();
var settingsTask = LoadSettingsAsync();
AccessibilityNodeInfo root = null;
switch (e.EventType)
{
case EventTypes.ViewFocused:
case EventTypes.ViewClicked:
if (e.Source == null || e.PackageName == BitwardenPackage)
{
CancelOverlayPrompt();
break;
}
root = RootInActiveWindow;
if (root == null || root.PackageName != e.PackageName)
{
break;
}
if (!(e.Source?.Password ?? false) && !AccessibilityHelpers.IsUsernameEditText(root, e))
{
CancelOverlayPrompt();
break;
}
if (ScanAndAutofill(root, e))
{
CancelOverlayPrompt();
}
else
{
OverlayPromptToAutofill(root, e);
}
break;
case EventTypes.WindowContentChanged:
case EventTypes.WindowStateChanged:
if (AccessibilityHelpers.LastCredentials == null)
{
break;
}
if (e.PackageName == BitwardenPackage)
{
CancelOverlayPrompt();
break;
}
root = RootInActiveWindow;
if (root == null || root.PackageName != e.PackageName)
{
break;
}
if (ScanAndAutofill(root, e))
{
CancelOverlayPrompt();
}
break;
default:
break;
}
}
// Suppress exceptions so that service doesn't crash.
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(">>> {0}: {1}", ex.GetType(), ex.StackTrace);
}
}
public override void OnInterrupt()
{
// Do nothing.
}
public bool ScanAndAutofill(AccessibilityNodeInfo root, AccessibilityEvent e)
{
var filled = false;
var uri = AccessibilityHelpers.GetUri(root);
if (uri != null && !uri.Contains(BitwardenWebsite) &&
AccessibilityHelpers.NeedToAutofill(AccessibilityHelpers.LastCredentials, uri))
{
var allEditTexts = AccessibilityHelpers.GetWindowNodes(root, e, n => AccessibilityHelpers.EditText(n), false);
var usernameEditText = AccessibilityHelpers.GetUsernameEditText(uri, allEditTexts);
var passwordNodes = AccessibilityHelpers.GetWindowNodes(root, e, n => n.Password, false);
if (usernameEditText != null || passwordNodes.Count > 0)
{
AccessibilityHelpers.FillCredentials(usernameEditText, passwordNodes);
filled = true;
_lastAutoFillTime = Java.Lang.JavaSystem.CurrentTimeMillis();
AccessibilityHelpers.LastCredentials = null;
}
allEditTexts.Dispose();
passwordNodes.Dispose();
}
if (AccessibilityHelpers.LastCredentials != null)
{
Task.Run(async () =>
{
await Task.Delay(1000);
AccessibilityHelpers.LastCredentials = null;
});
}
return filled;
}
private void OnAutofillTileClick()
{
CancelOverlayPrompt();
var root = RootInActiveWindow;
if (root != null && root.PackageName != BitwardenPackage &&
root.PackageName != AccessibilityHelpers.SystemUiPackage &&
!SkipPackage(root.PackageName))
{
var uri = AccessibilityHelpers.GetUri(root);
if (!string.IsNullOrWhiteSpace(uri))
{
var intent = new Intent(this, typeof(AccessibilityActivity));
intent.PutExtra("uri", uri);
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
StartActivity(intent);
return;
}
}
Toast.MakeText(this, AppResources.AutofillTileUriNotFound, ToastLength.Long).Show();
}
private void CancelOverlayPrompt()
{
_overlayAnchorObserverRunning = false;
if (_windowManager != null && _overlayView != null)
{
try
{
_windowManager.RemoveViewImmediate(_overlayView);
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Removed");
}
catch { }
}
_overlayView = null;
_lastAnchorX = 0;
_lastAnchorY = 0;
_isOverlayAboveAnchor = false;
if (_anchorNode != null)
{
_anchorNode.Recycle();
_anchorNode = null;
}
}
private void OverlayPromptToAutofill(AccessibilityNodeInfo root, AccessibilityEvent e)
{
if (Java.Lang.JavaSystem.CurrentTimeMillis() - _lastAutoFillTime < 1000 ||
AccessibilityHelpers.IsAutofillServicePromptVisible(Windows))
{
return;
}
if (!AccessibilityHelpers.OverlayPermitted())
{
if (!AccessibilityHelpers.IsAutofillTileAdded)
{
// The user has the option of only using the autofill tile and leaving the overlay permission
// disabled, so only show this toast if they're using accessibility without overlay permission and
// have _not_ added the autofill tile
System.Diagnostics.Debug.WriteLine(">>> Overlay Permission not granted");
Toast.MakeText(this, AppResources.AccessibilityOverlayPermissionAlert, ToastLength.Long).Show();
}
return;
}
if (_overlayView != null || _anchorNode != null || _overlayAnchorObserverRunning)
{
CancelOverlayPrompt();
}
var uri = AccessibilityHelpers.GetUri(root);
var fillable = !string.IsNullOrWhiteSpace(uri);
if (fillable)
{
if (_blacklistedUris != null && _blacklistedUris.Any())
{
if (Uri.TryCreate(uri, UriKind.Absolute, out var parsedUri) && parsedUri.Scheme.StartsWith("http"))
{
fillable = !_blacklistedUris.Contains(
string.Format("{0}://{1}", parsedUri.Scheme, parsedUri.Host));
}
else
{
fillable = !_blacklistedUris.Contains(uri);
}
}
}
if (!fillable)
{
return;
}
var intent = new Intent(this, typeof(AccessibilityActivity));
intent.PutExtra("uri", uri);
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
_overlayView = AccessibilityHelpers.GetOverlayView(this);
_overlayView.Measure(View.MeasureSpec.MakeMeasureSpec(0, 0),
View.MeasureSpec.MakeMeasureSpec(0, 0));
_overlayViewHeight = _overlayView.MeasuredHeight;
_overlayView.Click += (sender, eventArgs) =>
{
CancelOverlayPrompt();
StartActivity(intent);
};
var layoutParams = AccessibilityHelpers.GetOverlayLayoutParams();
var anchorPosition = AccessibilityHelpers.GetOverlayAnchorPosition(this, e.Source,
_overlayViewHeight, _isOverlayAboveAnchor);
layoutParams.X = anchorPosition.X;
layoutParams.Y = anchorPosition.Y;
if (_windowManager == null)
{
_windowManager = GetSystemService(WindowService).JavaCast<IWindowManager>();
}
_anchorNode = e.Source;
_lastAnchorX = anchorPosition.X;
_lastAnchorY = anchorPosition.Y;
_windowManager.AddView(_overlayView, layoutParams);
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Added at X:{0} Y:{1}",
layoutParams.X, layoutParams.Y);
StartOverlayAnchorObserver();
}
private void StartOverlayAnchorObserver()
{
if (_overlayAnchorObserverRunning)
{
return;
}
_overlayAnchorObserverRunning = true;
_overlayAnchorObserverRunnable = new Java.Lang.Runnable(() =>
{
if (_overlayAnchorObserverRunning)
{
AdjustOverlayForScroll();
_handler.PostDelayed(_overlayAnchorObserverRunnable, 250);
}
});
_handler.PostDelayed(_overlayAnchorObserverRunnable, 250);
}
private void AdjustOverlayForScroll()
{
if (_overlayView == null || _anchorNode == null ||
AccessibilityHelpers.IsAutofillServicePromptVisible(Windows))
{
CancelOverlayPrompt();
return;
}
var root = RootInActiveWindow;
IEnumerable<AccessibilityWindowInfo> windows = null;
if (Build.VERSION.SdkInt > BuildVersionCodes.Kitkat)
{
windows = Windows;
}
var anchorPosition = AccessibilityHelpers.GetOverlayAnchorPosition(this, _anchorNode, root,
windows, _overlayViewHeight, _isOverlayAboveAnchor);
if (anchorPosition == null)
{
CancelOverlayPrompt();
return;
}
else if (anchorPosition.X == -1 && anchorPosition.Y == -1)
{
if (_overlayView.Visibility != ViewStates.Gone)
{
_overlayView.Visibility = ViewStates.Gone;
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Hidden");
}
return;
}
else if (anchorPosition.X == -1)
{
_isOverlayAboveAnchor = false;
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Below Anchor");
return;
}
else if (anchorPosition.Y == -1)
{
_isOverlayAboveAnchor = true;
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Above Anchor");
return;
}
else if (anchorPosition.X == _lastAnchorX && anchorPosition.Y == _lastAnchorY)
{
if (_overlayView.Visibility != ViewStates.Visible)
{
_overlayView.Visibility = ViewStates.Visible;
}
return;
}
var layoutParams = AccessibilityHelpers.GetOverlayLayoutParams();
layoutParams.X = anchorPosition.X;
layoutParams.Y = anchorPosition.Y;
_lastAnchorX = anchorPosition.X;
_lastAnchorY = anchorPosition.Y;
_windowManager.UpdateViewLayout(_overlayView, layoutParams);
if (_overlayView.Visibility != ViewStates.Visible)
{
_overlayView.Visibility = ViewStates.Visible;
}
System.Diagnostics.Debug.WriteLine(">>> Accessibility Overlay View Updated to X:{0} Y:{1}",
layoutParams.X, layoutParams.Y);
}
private bool SkipPackage(string eventPackageName)
{
if (string.IsNullOrWhiteSpace(eventPackageName) ||
AccessibilityHelpers.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);
}
private void LoadServices()
{
if (_storageService == null)
{
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
}
if (_broadcasterService == null)
{
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
}
}
private async Task LoadSettingsAsync()
{
var now = DateTime.UtcNow;
if (_lastSettingsReload == null || (now - _lastSettingsReload.Value) > _settingsReloadSpan)
{
_lastSettingsReload = now;
var uris = await _storageService.GetAsync<List<string>>(Constants.AutofillBlacklistedUrisKey);
if (uris != null)
{
_blacklistedUris = new HashSet<string>(uris);
}
var isAutoFillTileAdded = await _storageService.GetAsync<bool?>(Constants.AutofillTileAdded);
AccessibilityHelpers.IsAutofillTileAdded = isAutoFillTileAdded.GetValueOrDefault();
}
}
}
}

View File

@@ -0,0 +1,23 @@
using System;
namespace Bit.Droid.Accessibility
{
public class Browser
{
public Browser(string packageName, string uriViewId)
{
PackageName = packageName;
UriViewId = uriViewId;
}
public Browser(string packageName, string uriViewId, Func<string, string> getUriFunction)
: this(packageName, uriViewId)
{
GetUriFunction = getUriFunction;
}
public string PackageName { get; set; }
public string UriViewId { get; set; }
public Func<string, string> GetUriFunction { get; set; } = (s) => s;
}
}

View File

@@ -1,11 +1,10 @@
namespace Bit.App.Models.Api
namespace Bit.Droid.Accessibility
{
public class SiteDataModel
public class Credentials
{
public string Name { get; set; }
public string Uri { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Notes { get; set; }
public string Uri { get; set; }
public string LastUri { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
namespace Bit.Droid.Accessibility
{
public class KnownUsernameField
{
public KnownUsernameField(string uriAuthority, string uriPathEnd, string usernameViewId)
{
UriAuthority = uriAuthority;
UriPathEnd = uriPathEnd;
UsernameViewId = usernameViewId;
}
public string UriAuthority { get; set; }
public string UriPathEnd { get; set; }
public string UsernameViewId { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using Android.Views.Accessibility;
using System;
using System.Collections.Generic;
namespace Bit.Droid.Accessibility
{
public class NodeList : List<AccessibilityNodeInfo>, IDisposable
{
public void Dispose()
{
foreach (var item in this)
{
item.Recycle();
item.Dispose();
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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");

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,236 @@
using System.Collections.Generic;
using Android.Content;
using Android.Service.Autofill;
using Android.Widget;
using System.Linq;
using Android.App;
using System.Threading.Tasks;
using Bit.App.Resources;
using Bit.Core.Enums;
using Android.Views.Autofill;
using Bit.Core.Abstractions;
namespace Bit.Droid.Autofill
{
public static class AutofillHelpers
{
private static int _pendingIntentId = 0;
// These browsers work natively with the Autofill Framework
//
// Be sure:
// - to keep these entries sorted alphabetically and
//
// - ... to keep this list in sync with values in AccessibilityHelpers.SupportedBrowsers [Section A], too.
public static HashSet<string> TrustedBrowsers = new HashSet<string>
{
"com.duckduckgo.mobile.android",
"org.mozilla.focus",
"org.mozilla.klar",
};
// These browsers work using the compatibility shim for the Autofill Framework
//
// Be sure:
// - to keep these entries sorted alphabetically,
// - to keep this list in sync with values in Resources/xml/autofillservice.xml, and
//
// - ... to keep this list in sync with values in AccessibilityHelpers.SupportedBrowsers [Section A], too.
public static HashSet<string> CompatBrowsers = new HashSet<string>
{
"com.amazon.cloud9",
"com.android.browser",
"com.android.chrome",
"com.avast.android.secure.browser",
"com.avg.android.secure.browser",
"com.brave.browser",
"com.brave.browser_beta",
"com.brave.browser_default",
"com.brave.browser_dev",
"com.brave.browser_nightly",
"com.chrome.beta",
"com.chrome.canary",
"com.chrome.dev",
"com.ecosia.android",
"com.google.android.apps.chrome",
"com.google.android.apps.chrome_dev",
"com.kiwibrowser.browser",
"com.microsoft.emmx",
"com.naver.whale",
"com.opera.browser",
"com.opera.browser.beta",
"com.opera.mini.native",
"com.opera.mini.native.beta",
"com.opera.touch",
"com.qwant.liberty",
"com.sec.android.app.sbrowser",
"com.sec.android.app.sbrowser.beta",
"com.stoutner.privacybrowser.free",
"com.stoutner.privacybrowser.standard",
"com.vivaldi.browser",
"com.vivaldi.browser.snapshot",
"com.vivaldi.browser.sopranos",
"com.yandex.browser",
"mark.via.gp",
"org.adblockplus.browser",
"org.adblockplus.browser.beta",
"org.bromite.bromite",
"org.bromite.chromium",
"org.chromium.chrome",
"org.codeaurora.swe.browser",
"org.gnu.icecat",
"org.mozilla.fenix",
"org.mozilla.fenix.nightly",
"org.mozilla.fennec_aurora",
"org.mozilla.fennec_fdroid",
"org.mozilla.firefox",
"org.mozilla.firefox_beta",
"org.mozilla.reference.browser",
"org.mozilla.rocket",
"org.torproject.torbrowser",
"org.torproject.torbrowser_alpha",
"org.ungoogled.chromium",
};
// The URLs are blacklisted from autofilling
public static HashSet<string> BlacklistedUris = new HashSet<string>
{
"androidapp://android",
"androidapp://com.android.settings",
"androidapp://com.x8bit.bitwarden",
"androidapp://com.oneplus.applocker",
};
public static async Task<List<FilledItem>> GetFillItemsAsync(Parser parser, ICipherService cipherService)
{
if (parser.FieldCollection.FillableForLogin)
{
var ciphers = await cipherService.GetAllDecryptedByUrlAsync(parser.Uri);
if (ciphers.Item1.Any() || ciphers.Item2.Any())
{
var allCiphers = ciphers.Item1.ToList();
allCiphers.AddRange(ciphers.Item2.ToList());
return allCiphers.Select(c => new FilledItem(c)).ToList();
}
}
else if (parser.FieldCollection.FillableForCard)
{
var ciphers = await cipherService.GetAllDecryptedAsync();
return ciphers.Where(c => c.Type == CipherType.Card).Select(c => new FilledItem(c)).ToList();
}
return new List<FilledItem>();
}
public static FillResponse BuildFillResponse(Parser parser, List<FilledItem> items, bool locked)
{
var responseBuilder = new FillResponse.Builder();
if (items != null && items.Count > 0)
{
foreach (var item in items)
{
var dataset = BuildDataset(parser.ApplicationContext, parser.FieldCollection, item);
if (dataset != null)
{
responseBuilder.AddDataset(dataset);
}
}
}
responseBuilder.AddDataset(BuildVaultDataset(parser.ApplicationContext, 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(filledItem.Name, filledItem.Subtitle, filledItem.Icon, context));
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(
AppResources.AutofillWithBitwarden,
locked ? AppResources.VaultIsLocked : AppResources.GoToMyVault,
Resource.Drawable.icon,
context);
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 text, string subtext, int iconId, Context context)
{
var packageName = context.PackageName;
var view = new RemoteViews(packageName, Resource.Layout.autofill_listitem);
view.SetTextViewText(Resource.Id.text1, 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());
}
}
}

View File

@@ -0,0 +1,130 @@
using Android;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Service.Autofill;
using Android.Widget;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.Core.Utilities;
using System.Collections.Generic;
using System.Linq;
namespace Bit.Droid.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 : Android.Service.Autofill.AutofillService
{
private ICipherService _cipherService;
private IVaultTimeoutService _vaultTimeoutService;
private IStorageService _storageService;
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, ApplicationContext);
parser.Parse();
if (_storageService == null)
{
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
}
var shouldAutofill = await parser.ShouldAutofillAsync(_storageService);
if (!shouldAutofill)
{
return;
}
if (_vaultTimeoutService == null)
{
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
}
List<FilledItem> items = null;
var locked = await _vaultTimeoutService.IsLockedAsync();
if (!locked)
{
if (_cipherService == null)
{
_cipherService = ServiceContainer.Resolve<ICipherService>("cipherService");
}
items = await AutofillHelpers.GetFillItemsAsync(parser, _cipherService);
}
// build response
var response = AutofillHelpers.BuildFillResponse(parser, items, locked);
callback.OnSuccess(response);
}
public async override void OnSaveRequest(SaveRequest request, SaveCallback callback)
{
var structure = request.FillContexts?.LastOrDefault()?.Structure;
if (structure == null)
{
return;
}
if (_storageService == null)
{
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
}
var disableSavePrompt = await _storageService.GetAsync<bool?>(Constants.AutofillDisableSavePromptKey);
if (disableSavePrompt.GetValueOrDefault())
{
return;
}
var parser = new Parser(structure, ApplicationContext);
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);
}
}
}

View File

@@ -0,0 +1,195 @@
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.Droid.Autofill
{
public class Field
{
private List<string> _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<string> 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<string> 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; }
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<string> FilterForSupportedHints(string[] hints)
{
return hints?.Where(h => IsValidHint(h)).ToList() ?? new List<string>();
}
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;
}
}
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;
}
}
}
}
}

View File

@@ -0,0 +1,342 @@
using System.Collections.Generic;
using Android.Service.Autofill;
using Android.Views.Autofill;
using System.Linq;
using Android.Text;
using Android.Views;
namespace Bit.Droid.Autofill
{
public class FieldCollection
{
private List<Field> _passwordFields = null;
private List<Field> _usernameFields = null;
private HashSet<string> _ignoreSearchTerms = new HashSet<string> { "search", "find", "recipient", "edit" };
private HashSet<string> _passwordTerms = new HashSet<string> { "password", "pswd" };
public List<AutofillId> AutofillIds { get; private set; } = new List<AutofillId>();
public SaveDataType SaveType
{
get
{
if (FillableForLogin)
{
return SaveDataType.Password;
}
else if (FillableForCard)
{
return SaveDataType.CreditCard;
}
return SaveDataType.Generic;
}
}
public HashSet<string> Hints { get; private set; } = new HashSet<string>();
public HashSet<string> FocusedHints { get; private set; } = new HashSet<string>();
public HashSet<string> FieldTrackingIds { get; private set; } = new HashSet<string>();
public List<Field> Fields { get; private set; } = new List<Field>();
public IDictionary<string, List<Field>> HintToFieldsMap { get; private set; } =
new Dictionary<string, List<Field>>();
public List<AutofillId> IgnoreAutofillIds { get; private set; } = new List<AutofillId>();
public List<Field> PasswordFields
{
get
{
if (_passwordFields != null)
{
return _passwordFields;
}
if (Hints.Any())
{
_passwordFields = new List<Field>();
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<Field> UsernameFields
{
get
{
if (_usernameFields != null)
{
return _usernameFields;
}
_usernameFields = new List<Field>();
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<Field>());
}
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 = Core.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 = Core.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<Field>();
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<string> 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<string> terms)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}
var lowerValue = value.ToLowerInvariant();
return terms.Any(t => lowerValue.Contains(t));
}
}
}

View File

@@ -0,0 +1,224 @@
using Android.Service.Autofill;
using Android.Views.Autofill;
using System.Linq;
using Bit.Core.Enums;
using Android.Views;
using Bit.Core.Models.View;
namespace Bit.Droid.Autofill
{
public class FilledItem
{
private string _password;
private string _cardName;
private string _cardNumber;
private string _cardExpMonth;
private string _cardExpYear;
private string _cardCode;
private string _idPhone;
private string _idEmail;
private string _idUsername;
private string _idAddress;
private string _idPostalCode;
public FilledItem(CipherView cipher)
{
Name = cipher.Name;
Type = cipher.Type;
Subtitle = cipher.SubTitle;
switch (Type)
{
case CipherType.Login:
Icon = Resource.Drawable.login;
_password = cipher.Login.Password;
break;
case CipherType.Card:
_cardNumber = cipher.Card.Number;
Icon = Resource.Drawable.card;
_cardName = cipher.Card.CardholderName;
_cardCode = cipher.Card.Code;
_cardExpMonth = cipher.Card.ExpMonth;
_cardExpYear = cipher.Card.ExpYear;
break;
case CipherType.Identity:
Icon = Resource.Drawable.id;
_idPhone = cipher.Identity.Phone;
_idEmail = cipher.Identity.Email;
_idUsername = cipher.Identity.Username;
_idAddress = cipher.Identity.FullAddress;
_idPostalCode = cipher.Identity.PostalCode;
break;
default:
Icon = Resource.Drawable.login;
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))
{
foreach (var f in fieldCollection.PasswordFields)
{
var val = ApplyValue(f, _password);
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, Android.Views.View.AutofillHintCreditCardNumber,
_cardNumber))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintCreditCardSecurityCode,
_cardCode))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection,
Android.Views.View.AutofillHintCreditCardExpirationMonth, _cardExpMonth, true))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintCreditCardExpirationYear,
_cardExpYear))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintName, _cardName))
{
setValues = true;
}
}
else if (Type == CipherType.Identity)
{
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintPhone, _idPhone))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintEmailAddress, _idEmail))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintUsername,
_idUsername))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintPostalAddress,
_idAddress))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintPostalCode,
_idPostalCode))
{
setValues = true;
}
if (ApplyValue(datasetBuilder, fieldCollection, Android.Views.View.AutofillHintName, Subtitle))
{
setValues = true;
}
}
return setValues;
}
private static bool ApplyValue(Dataset.Builder builder, FieldCollection fieldCollection,
string hint, string value, bool monthValue = false)
{
bool setValues = false;
if (fieldCollection.HintToFieldsMap.ContainsKey(hint) && !string.IsNullOrWhiteSpace(value))
{
foreach (var f in fieldCollection.HintToFieldsMap[hint])
{
var val = ApplyValue(f, 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;
}
}
}

View File

@@ -0,0 +1,176 @@
using static Android.App.Assist.AssistStructure;
using Android.App.Assist;
using System.Collections.Generic;
using Bit.Core;
using Android.Content;
using Bit.Core.Abstractions;
using System.Threading.Tasks;
using Android.OS;
namespace Bit.Droid.Autofill
{
public class Parser
{
public static HashSet<string> _excludedPackageIds = new HashSet<string>
{
"android"
};
private readonly AssistStructure _structure;
private string _uri;
private string _packageName;
private string _website;
public Parser(AssistStructure structure, Context applicationContext)
{
_structure = structure;
ApplicationContext = applicationContext;
}
public Context ApplicationContext { get; set; }
public FieldCollection FieldCollection { get; private set; } = new FieldCollection();
public string Uri
{
get
{
if (!string.IsNullOrWhiteSpace(_uri))
{
return _uri;
}
var websiteNull = string.IsNullOrWhiteSpace(Website);
if (websiteNull && string.IsNullOrWhiteSpace(PackageName))
{
_uri = null;
}
else if (!websiteNull)
{
_uri = Website;
}
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 Website
{
get => _website;
set
{
if (string.IsNullOrWhiteSpace(value))
{
_website = _uri = null;
}
_website = value;
}
}
public async Task<bool> ShouldAutofillAsync(IStorageService storageService)
{
var fillable = !string.IsNullOrWhiteSpace(Uri) && !AutofillHelpers.BlacklistedUris.Contains(Uri) &&
FieldCollection != null && FieldCollection.Fillable;
if (fillable)
{
var blacklistedUris = await storageService.GetAsync<List<string>>(Constants.AutofillBlacklistedUrisKey);
if (blacklistedUris != null && blacklistedUris.Count > 0)
{
fillable = !new HashSet<string>(blacklistedUris).Contains(Uri);
}
}
return fillable;
}
public void Parse()
{
string titlePackageId = null;
for (var i = 0; i < _structure.WindowNodeCount; i++)
{
var node = _structure.GetWindowNodeAt(i);
if (i == 0)
{
titlePackageId = GetTitlePackageId(node);
}
ParseNode(node.RootViewNode);
}
if (string.IsNullOrWhiteSpace(PackageName) && string.IsNullOrWhiteSpace(Website))
{
PackageName = titlePackageId;
}
if (!AutofillHelpers.TrustedBrowsers.Contains(PackageName) &&
!AutofillHelpers.CompatBrowsers.Contains(PackageName))
{
Website = 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(Website) && !string.IsNullOrWhiteSpace(node.WebDomain))
{
var scheme = "http";
if ((int)Build.VERSION.SdkInt >= 28)
{
scheme = node.WebScheme;
}
Website = string.Format("{0}://{1}", scheme, node.WebDomain);
}
}
private string GetTitlePackageId(WindowNode node)
{
if (node != null && !string.IsNullOrWhiteSpace(node.Title))
{
var slashPosition = node.Title.IndexOf('/');
if (slashPosition > -1)
{
var packageId = node.Title.Substring(0, slashPosition);
if (packageId.Contains("."))
{
return packageId;
}
}
}
return null;
}
}
}

View File

@@ -0,0 +1,26 @@
using Bit.Core.Enums;
namespace Bit.Droid.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; }
}
}
}

View File

@@ -1,58 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Bit.App.Models;
namespace Bit.Android
{
//[Activity(Label = "Autofill", LaunchMode = global::Android.Content.PM.LaunchMode.SingleInstance, Theme = "@style/android:Theme.Material.Light")]
public class AutofillActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
var url = Intent.GetStringExtra("url");
_lastQueriedUrl = url;
//StartActivityForResult(Kp2aControl.GetQueryEntryIntent(url), 123);
}
string _lastQueriedUrl;
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
try
{
// TODO: lookup site
LastReceivedCredentials = new Credentials { User = "username", Password = "12345678", Url = _lastQueriedUrl };
}
catch(Exception e)
{
//Android.Util.Log.Debug("KP2AAS", "Exception while receiving credentials: " + e.ToString());
}
finally
{
Finish();
}
}
public static Credentials LastReceivedCredentials;
public class Credentials
{
public string User;
public string Password;
public string Url;
}
}
}

View File

@@ -1,229 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.AccessibilityServices;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Views.Accessibility;
using Android.Widget;
namespace Bit.Android
{
//[Service(Permission = "android.permission.BIND_ACCESSIBILITY_SERVICE", Label = "bitwarden")]
//[IntentFilter(new string[] { "android.accessibilityservice.AccessibilityService" })]
//[MetaData("android.accessibilityservice", Resource = "@xml/accessibilityservice")]
public class AutofillService : AccessibilityService
{
private const int autoFillNotificationId = 0;
private const string androidAppPrefix = "androidapp://";
public override void OnAccessibilityEvent(AccessibilityEvent e)
{
var eventType = e.EventType;
var package = e.PackageName;
switch(eventType)
{
case EventTypes.ViewTextSelectionChanged:
//if(e.Source.Password && string.IsNullOrWhiteSpace(e.Source.Text))
//{
// var bundle = new Bundle();
// bundle.PutCharSequence(AccessibilityNodeInfo.ActionArgumentSetTextCharsequence, "mypassword");
// e.Source.PerformAction(global::Android.Views.Accessibility.Action.SetText, bundle);
//}
break;
case EventTypes.WindowContentChanged:
case EventTypes.WindowStateChanged:
if(e.PackageName == "com.android.systemui")
{
break;
}
var root = RootInActiveWindow;
if((ExistsNodeOrChildren(root, n => n.WindowId == e.WindowId) && !ExistsNodeOrChildren(root, n => (n.ViewIdResourceName != null) && (n.ViewIdResourceName.StartsWith("com.android.systemui")))))
{
bool cancelNotification = true;
var allEditTexts = GetNodeOrChildren(root, n => { return IsEditText(n); });
var usernameEdit = allEditTexts.TakeWhile(edit => (edit.Password == false)).LastOrDefault();
string searchString = androidAppPrefix + root.PackageName;
string url = androidAppPrefix + root.PackageName;
if(root.PackageName == "com.android.chrome")
{
var addressField = root.FindAccessibilityNodeInfosByViewId("com.android.chrome:id/url_bar").FirstOrDefault();
UrlFromAddressField(ref url, addressField);
}
else if(root.PackageName == "com.android.browser")
{
var addressField = root.FindAccessibilityNodeInfosByViewId("com.android.browser:id/url").FirstOrDefault();
UrlFromAddressField(ref url, addressField);
}
var emptyPasswordFields = GetNodeOrChildren(root, n => { return IsPasswordField(n); }).ToList();
if(emptyPasswordFields.Any())
{
if((AutofillActivity.LastReceivedCredentials != null) && IsSame(AutofillActivity.LastReceivedCredentials.Url, url))
{
//Android.Util.Log.Debug("KP2AAS", "Filling credentials for " + url);
FillPassword(url, usernameEdit, emptyPasswordFields);
}
else
{
//Android.Util.Log.Debug("KP2AAS", "Notif for " + url);
if(AutofillActivity.LastReceivedCredentials != null)
{
//Android.Util.Log.Debug("KP2AAS", LookupCredentialsActivity.LastReceivedCredentials.Url);
//Android.Util.Log.Debug("KP2AAS", url);
}
AskFillPassword(url, usernameEdit, emptyPasswordFields);
cancelNotification = false;
}
}
if(cancelNotification)
{
((NotificationManager)GetSystemService(NotificationService)).Cancel(autoFillNotificationId);
//Android.Util.Log.Debug("KP2AAS", "Cancel notif");
}
}
break;
default:
break;
}
}
public override void OnInterrupt()
{
}
private static void UrlFromAddressField(ref string url, AccessibilityNodeInfo addressField)
{
if(addressField != null)
{
url = addressField.Text;
if(!url.Contains("://"))
url = "http://" + url;
}
}
private bool IsSame(string url1, string url2)
{
if(url1.StartsWith("androidapp://"))
return url1 == url2;
//return KeePassLib.Utility.UrlUtil.GetHost(url1) == KeePassLib.Utility.UrlUtil.GetHost(url2);
return false;
}
private static bool IsPasswordField(AccessibilityNodeInfo n)
{
//if (n.Password) Android.Util.Log.Debug(_logTag, "pwdx with " + (n.Text == null ? "null" : n.Text));
var res = n.Password && string.IsNullOrEmpty(n.Text);
// if (n.Password) Android.Util.Log.Debug(_logTag, "pwd with " + n.Text + res);
return res;
}
private static bool IsEditText(AccessibilityNodeInfo n)
{
//it seems like n.Editable is not a good check as this is false for some fields which are actually editable, at least in tests with Chrome.
return (n.ClassName != null) && (n.ClassName.Contains("EditText"));
}
private void AskFillPassword(string url, AccessibilityNodeInfo usernameEdit, IEnumerable<AccessibilityNodeInfo> passwordFields)
{
var runSearchIntent = new Intent(this, typeof(AutofillActivity));
runSearchIntent.PutExtra("url", url);
runSearchIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
var pending = PendingIntent.GetActivity(this, 0, runSearchIntent, PendingIntentFlags.UpdateCurrent);
var targetName = url;
if(url.StartsWith(androidAppPrefix))
{
var packageName = url.Substring(androidAppPrefix.Length);
try
{
var appInfo = PackageManager.GetApplicationInfo(packageName, 0);
targetName = (string)(appInfo != null ? PackageManager.GetApplicationLabel(appInfo) : packageName);
}
catch(Exception e)
{
//Android.Util.Log.Debug(_logTag, e.ToString());
targetName = packageName;
}
}
else
{
//targetName = KeePassLib.Utility.UrlUtil.GetHost(url);
}
var builder = new Notification.Builder(this);
//TODO icon
//TODO plugin icon
builder.SetSmallIcon(Resource.Drawable.icon)
.SetContentText("Content Text")
.SetContentTitle("Content Title")
.SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis())
.SetTicker("Ticker Text")
.SetVisibility(NotificationVisibility.Secret)
.SetContentIntent(pending);
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.Notify(autoFillNotificationId, builder.Build());
}
private void FillPassword(string url, AccessibilityNodeInfo usernameEdit, IEnumerable<AccessibilityNodeInfo> passwordFields)
{
FillDataInTextField(usernameEdit, AutofillActivity.LastReceivedCredentials.User);
foreach(var pwd in passwordFields)
FillDataInTextField(pwd, AutofillActivity.LastReceivedCredentials.Password);
AutofillActivity.LastReceivedCredentials = null;
}
private static void FillDataInTextField(AccessibilityNodeInfo edit, string newValue)
{
Bundle b = new Bundle();
b.PutString(AccessibilityNodeInfo.ActionArgumentSetTextCharsequence, newValue);
edit.PerformAction(global::Android.Views.Accessibility.Action.SetText, b);
}
private bool ExistsNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p)
{
return GetNodeOrChildren(n, p).Any();
}
private IEnumerable<AccessibilityNodeInfo> GetNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p)
{
if(n != null)
{
if(p(n))
{
yield return n;
}
for(int i = 0; i < n.ChildCount; i++)
{
foreach(var x in GetNodeOrChildren(n.GetChild(i), p))
{
yield return x;
}
}
}
}
}
}

View File

@@ -1,26 +0,0 @@
using System;
using System.ComponentModel;
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
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if(Control.TextSize == (float)Device.GetNamedSize(NamedSize.Default, typeof(Button)))
{
Control.TextSize = (float)Device.GetNamedSize(NamedSize.Medium, typeof(Button));
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
}
}
}

View File

@@ -1,18 +0,0 @@
using System;
using System.ComponentModel;
using Bit.Android.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(SearchBar), typeof(CustomSearchBarRenderer))]
namespace Bit.Android.Controls
{
public class CustomSearchBarRenderer : SearchBarRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
base.OnElementChanged(e);
Control.SetPadding((int)global::Android.App.Application.Context.ToPixels(-8), 0, 0, 0);
}
}
}

View File

@@ -1,62 +0,0 @@
using System;
using System.ComponentModel;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedButton), typeof(ExtendedButtonRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedButtonRenderer : CustomButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
SetPadding();
SetUppercase();
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == ExtendedButton.PaddingProperty.PropertyName)
{
SetPadding();
}
else if(e.PropertyName == ExtendedButton.UppercaseProperty.PropertyName)
{
SetUppercase();
}
}
private void SetPadding()
{
var element = Element as ExtendedButton;
if(element != null)
{
Control.SetPadding(
(int)element.Padding.Left,
(int)element.Padding.Top,
(int)element.Padding.Right,
(int)element.Padding.Bottom);
}
}
private void SetUppercase()
{
var element = Element as ExtendedButton;
if(element != null && !string.IsNullOrWhiteSpace(element.Text))
{
if(element.Uppercase)
{
element.Text = element.Text.ToUpperInvariant();
}
else
{
Control.TransformationMethod = null;
}
}
}
}
}

View File

@@ -1,48 +0,0 @@
using System;
using System.ComponentModel;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedEditor), typeof(ExtendedEditorRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedEditorRenderer : EditorRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
var view = (ExtendedEditor)Element;
SetBorder(view);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var view = (ExtendedEditor)Element;
if(e.PropertyName == ExtendedEditor.HasBorderProperty.PropertyName)
{
SetBorder(view);
}
else
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
{
Control.SetBackgroundColor(view.BackgroundColor.ToAndroid());
}
}
}
private void SetBorder(ExtendedEditor view)
{
if(!view.HasBorder)
{
Control.SetBackgroundColor(global::Android.Graphics.Color.Transparent);
}
}
}
}

View File

@@ -1,173 +0,0 @@
using System;
using System.ComponentModel;
using Android.Graphics;
using Android.Text;
using Android.Text.Method;
using Android.Views.InputMethods;
using Android.Widget;
using Bit.Android.Controls;
using Bit.App.Controls;
using Bit.App.Enums;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedEntry), typeof(ExtendedEntryRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedEntryRenderer : EntryRenderer
{
private bool _isPassword;
private bool _toggledPassword;
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
var view = (ExtendedEntry)Element;
_isPassword = view.IsPassword;
if(Control != null)
{
Control.SetIncludeFontPadding(false);
if(e.NewElement != null && e.NewElement.IsPassword)
{
Control.SetTypeface(Typeface.Default, TypefaceStyle.Normal);
Control.TransformationMethod = new PasswordTransformationMethod();
}
}
SetBorder(view);
SetMaxLength(view);
SetReturnType(view);
// Editor Action is called when the return button is pressed
Control.EditorAction += (object sender, TextView.EditorActionEventArgs args) =>
{
if(view.ReturnType != ReturnType.Next)
{
view.Unfocus();
}
// Call all the methods attached to base_entry event handler Completed
view.InvokeCompleted();
};
if(view.DisableAutocapitalize)
{
Control.SetRawInputType(Control.InputType |= InputTypes.TextVariationEmailAddress);
}
if(view.Autocorrect.HasValue)
{
Control.SetRawInputType(Control.InputType |= InputTypes.TextFlagNoSuggestions);
}
view.ToggleIsPassword += (object sender, EventArgs args) =>
{
var cursorStart = Control.SelectionStart;
var cursorEnd = Control.SelectionEnd;
Control.TransformationMethod = _isPassword ? null : new PasswordTransformationMethod();
// set focus
Control.RequestFocus();
if(_toggledPassword)
{
// restore cursor position
Control.SetSelection(cursorStart, cursorEnd);
}
else
{
// set cursor to end
Control.SetSelection(Control.Text.Length);
}
// show keyboard
var app = XLabs.Ioc.Resolver.Resolve<global::Android.App.Application>();
var inputMethodManager =
app.GetSystemService(global::Android.Content.Context.InputMethodService) as InputMethodManager;
inputMethodManager.ShowSoftInput(Control, ShowFlags.Forced);
inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
_isPassword = view.IsPasswordFromToggled = !_isPassword;
_toggledPassword = true;
};
if(view.FontFamily == "monospace")
{
Control.Typeface = Typeface.Monospace;
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var view = (ExtendedEntry)Element;
if(e.PropertyName == ExtendedEntry.HasBorderProperty.PropertyName
|| e.PropertyName == ExtendedEntry.HasOnlyBottomBorderProperty.PropertyName
|| e.PropertyName == ExtendedEntry.BottomBorderColorProperty.PropertyName)
{
SetBorder(view);
}
else
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
{
Control.SetBackgroundColor(view.BackgroundColor.ToAndroid());
}
}
if(view.FontFamily == "monospace")
{
Control.Typeface = Typeface.Monospace;
}
}
private void SetReturnType(ExtendedEntry view)
{
if(view.ReturnType.HasValue)
{
switch(view.ReturnType.Value)
{
case ReturnType.Go:
Control.ImeOptions = ImeAction.Go;
Control.SetImeActionLabel("Go", ImeAction.Go);
break;
case ReturnType.Next:
Control.ImeOptions = ImeAction.Next;
Control.SetImeActionLabel("Next", ImeAction.Next);
break;
case ReturnType.Search:
Control.ImeOptions = ImeAction.Search;
Control.SetImeActionLabel("Search", ImeAction.Search);
break;
case ReturnType.Send:
Control.ImeOptions = ImeAction.Send;
Control.SetImeActionLabel("Send", ImeAction.Send);
break;
default:
Control.SetImeActionLabel("Done", ImeAction.Done);
break;
}
}
}
private void SetBorder(ExtendedEntry view)
{
if(!view.HasBorder)
{
Control.SetBackgroundColor(global::Android.Graphics.Color.Transparent);
}
else
{
Control.SetBackgroundColor(view.BottomBorderColor.ToAndroid());
}
}
private void SetMaxLength(ExtendedEntry view)
{
Control.SetFilters(new IInputFilter[] { new InputFilterLengthFilter(view.MaxLength) });
}
}
}

View File

@@ -1,49 +0,0 @@
using System;
using System.ComponentModel;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedPicker), typeof(ExtendedPickerRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedPickerRenderer : PickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
var view = (ExtendedPicker)Element;
Control.TextSize = (float)Device.GetNamedSize(NamedSize.Medium, typeof(Picker));
SetBorder(view);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var view = (ExtendedPicker)Element;
if(e.PropertyName == ExtendedPicker.HasBorderProperty.PropertyName)
{
SetBorder(view);
}
else
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
{
Control.SetBackgroundColor(view.BackgroundColor.ToAndroid());
}
}
}
private void SetBorder(ExtendedPicker view)
{
if(!view.HasBorder)
{
Control.SetBackgroundColor(global::Android.Graphics.Color.Transparent);
}
}
}
}

View File

@@ -1,72 +0,0 @@
using Android.Content;
using System.ComponentModel;
using Android.Views;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using AView = Android.Views.View;
using Android.Widget;
[assembly: ExportRenderer(typeof(ExtendedSwitchCell), typeof(ExtendedSwitchCellRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedSwitchCellRenderer : SwitchCellRenderer
{
protected BaseCellView View { get; private set; }
protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context)
{
var View = base.GetCellCore(item, convertView, parent, context) as SwitchCellView;
var extendedCell = (ExtendedSwitchCell)item;
if(View != null)
{
if(extendedCell.BackgroundColor != Color.White)
{
View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid());
}
else
{
View.SetBackgroundResource(Resource.Drawable.list_selector);
}
if(item.IsEnabled)
{
View.SetMainTextColor(Color.Black);
}
else
{
View.SetMainTextColor(Color.FromHex("777777"));
}
if(View.ChildCount > 1)
{
var layout = View.GetChildAt(1) as LinearLayout;
if(layout != null && layout.ChildCount > 0)
{
var textView = layout.GetChildAt(0) as TextView;
if(textView != null)
{
textView.TextSize = (float)Device.GetNamedSize(NamedSize.Medium, typeof(Label));
}
}
}
}
return View;
}
protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
{
base.OnCellPropertyChanged(sender, args);
var cell = (ExtendedSwitchCell)Cell;
if(args.PropertyName == ExtendedSwitchCell.BackgroundColorProperty.PropertyName)
{
View.SetBackgroundColor(cell.BackgroundColor.ToAndroid());
}
}
}
}

View File

@@ -1,96 +0,0 @@
using System;
using System.ComponentModel;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Support.Design.Widget;
using Xamarin.Forms.Platform.Android.AppCompat;
using System.Reflection;
using System.Linq;
[assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedTabbedPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
{
private TabLayout _tabLayout;
protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
{
base.OnElementChanged(e);
var view = (ExtendedTabbedPage)Element;
var field = typeof(ExtendedTabbedPageRenderer).BaseType.GetField("_tabLayout",
BindingFlags.Instance | BindingFlags.NonPublic);
_tabLayout = field?.GetValue(this) as TabLayout;
if(_tabLayout != null)
{
var tab = _tabLayout.GetTabAt(0);
SetSelectedTabIcon(tab, Element.Children[0].Icon, true);
}
}
void TabLayout.IOnTabSelectedListener.OnTabSelected(TabLayout.Tab tab)
{
if(Element == null)
{
return;
}
var selectedIndex = tab.Position;
var child = Element.Children[selectedIndex];
if(Element.Children.Count > selectedIndex && selectedIndex >= 0)
{
Element.CurrentPage = Element.Children[selectedIndex];
}
SetSelectedTabIcon(tab, child.Icon, true);
}
void TabLayout.IOnTabSelectedListener.OnTabUnselected(TabLayout.Tab tab)
{
var child = Element.Children[tab.Position];
SetSelectedTabIcon(tab, child.Icon, false);
}
private void SetSelectedTabIcon(TabLayout.Tab tab, string icon, bool selected)
{
if(string.IsNullOrEmpty(icon))
{
return;
}
if(selected)
{
var selectedResource = IdFromTitle(string.Format("{0}_selected", icon), ResourceManager.DrawableClass);
if(selectedResource != 0)
{
tab.SetIcon(selectedResource);
return;
}
}
var resource = IdFromTitle(icon, ResourceManager.DrawableClass);
tab.SetIcon(resource);
}
private int IdFromTitle(string title, Type type)
{
var name = System.IO.Path.GetFileNameWithoutExtension(title);
return GetId(type, name);
}
private int GetId(Type type, string propertyName)
{
var props = type.GetFields();
var prop = props.FirstOrDefault(p => p.Name == propertyName);
if(prop != null)
{
return (int)prop.GetValue(type);
}
return 0;
}
}
}

View File

@@ -1,165 +0,0 @@
using System;
using Android.Widget;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using AView = Android.Views.View;
using AListView = Android.Widget.ListView;
using Android.Views;
[assembly: ExportRenderer(typeof(ExtendedTableView), typeof(ExtendedTableViewRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedTableViewRenderer : TableViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
{
base.OnElementChanged(e);
Control.Divider = null;
Control.DividerHeight = 0;
}
protected override TableViewModelRenderer GetModelRenderer(AListView listView, TableView view)
{
return new CustomTableViewModelRenderer(Context, listView, view);
}
public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint)
{
var baseSize = base.GetDesiredSize(widthConstraint, heightConstraint);
var height = ComputeHeight(Control, Convert.ToInt32(baseSize.Request.Width));
return new SizeRequest(new Size(baseSize.Request.Width, height));
}
private int ComputeHeight(AListView listView, int width)
{
var element = Element as ExtendedTableView;
var adapter = listView.Adapter;
var totalHeight = listView.PaddingTop + listView.PaddingBottom;
var desiredWidth = MeasureSpec.MakeMeasureSpec(width, MeasureSpecMode.AtMost);
for(var i = 0; i < adapter.Count; i++)
{
if(i == 0 && (element?.NoHeader ?? false))
{
totalHeight += 1;
continue;
}
var view = adapter.GetView(i, null, listView);
view.LayoutParameters = new LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
view.Measure(desiredWidth, MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified));
totalHeight += view.MeasuredHeight;
}
return totalHeight + (listView.DividerHeight * (adapter.Count - 1));
}
private class CustomTableViewModelRenderer : TableViewModelRenderer
{
private readonly ExtendedTableView _view;
private readonly AListView _listView;
public CustomTableViewModelRenderer(Context context, AListView listView, TableView view)
: base(context, listView, view)
{
_view = view as ExtendedTableView;
_listView = listView;
}
private ITableViewController Controller => _view;
// ref http://bit.ly/2b9cjnQ
public override AView GetView(int position, AView convertView, ViewGroup parent)
{
var baseView = base.GetView(position, convertView, parent);
var layout = baseView as LinearLayout;
if(layout == null)
{
return baseView;
}
bool isHeader, nextIsHeader;
var cell = GetCellForPosition(position, out isHeader, out nextIsHeader);
if(layout.ChildCount > 0)
{
layout.RemoveViewAt(0);
var cellView = CellFactory.GetCell(cell, convertView, parent, Context, _view);
layout.AddView(cellView, 0);
}
if(isHeader)
{
var textCell = layout.GetChildAt(0) as BaseCellView;
if(textCell != null)
{
if(position == 0 && _view.NoHeader)
{
textCell.Visibility = ViewStates.Gone;
}
else
{
textCell.MainText = textCell.MainText?.ToUpperInvariant();
textCell.SetMainTextColor(Color.FromHex("777777"));
}
}
}
var bline = layout.GetChildAt(1);
if(bline != null)
{
bline.SetBackgroundColor(_view.SeparatorColor.ToAndroid());
}
return layout;
}
// Copy/pasted from Xamarin source. Invoke via reflection instead maybe?
private Cell GetCellForPosition(int position, out bool isHeader, out bool nextIsHeader)
{
isHeader = false;
nextIsHeader = false;
var model = Controller.Model;
var sectionCount = model.GetSectionCount();
for(var sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++)
{
var size = model.GetRowCount(sectionIndex) + 1;
if(position == 0)
{
isHeader = true;
nextIsHeader = size == 0 && sectionIndex < sectionCount - 1;
var header = model.GetHeaderCell(sectionIndex);
Cell resultCell = null;
if(header != null)
{
resultCell = header;
}
if(resultCell == null)
{
resultCell = new TextCell { Text = model.GetSectionTitle(sectionIndex) };
}
resultCell.Parent = _view;
return resultCell;
}
if(position < size)
{
nextIsHeader = position == size - 1;
return (Cell)model.GetItem(sectionIndex, position - 1);
}
position -= size;
}
return null;
}
}
}
}

View File

@@ -1,155 +0,0 @@
using Android.Content;
using System.ComponentModel;
using Android.Views;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using AView = Android.Views.View;
using Android.Widget;
using Android.Text;
[assembly: ExportRenderer(typeof(ExtendedTextCell), typeof(ExtendedTextCellRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedTextCellRenderer : TextCellRenderer
{
protected AView View { get; private set; }
protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context)
{
var View = (BaseCellView)base.GetCellCore(item, convertView, parent, context);
var extendedCell = (ExtendedTextCell)item;
if(View != null)
{
if(extendedCell.BackgroundColor != Color.White)
{
View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid());
}
else
{
View.SetBackgroundResource(Resource.Drawable.list_selector);
}
if(extendedCell.ShowDisclousure)
{
var resourceId = Resource.Drawable.ion_chevron_right;
if(!string.IsNullOrWhiteSpace(extendedCell.DisclousureImage))
{
var fileName = System.IO.Path.GetFileNameWithoutExtension(extendedCell.DisclousureImage);
resourceId = context.Resources.GetIdentifier(fileName, "drawable", context.PackageName);
}
var image = new DisclosureImage(context, extendedCell);
image.SetImageResource(resourceId);
image.SetPadding(10, 10, 30, 10);
View.SetAccessoryView(image);
}
if(View.ChildCount > 1)
{
var layout = View.GetChildAt(1) as LinearLayout;
if(layout != null)
{
if(layout.ChildCount > 0)
{
var textView = layout.GetChildAt(0) as TextView;
if(textView != null)
{
textView.TextSize = (float)Device.GetNamedSize(NamedSize.Medium, typeof(Label));
}
}
if(layout.ChildCount > 1)
{
var detailView = layout.GetChildAt(1) as TextView;
if(detailView != null)
{
UpdateLineBreakMode(detailView, extendedCell.DetailLineBreakMode);
}
}
}
}
}
return View;
}
protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
{
base.OnCellPropertyChanged(sender, args);
var cell = (ExtendedTextCell)Cell;
if(args.PropertyName == ExtendedTextCell.BackgroundColorProperty.PropertyName)
{
View.SetBackgroundColor(cell.BackgroundColor.ToAndroid());
}
// TODO: other properties
}
private void UpdateLineBreakMode(TextView view, LineBreakMode lineBreakMode)
{
if(view == null)
{
return;
}
switch(lineBreakMode)
{
case LineBreakMode.NoWrap:
view.SetSingleLine(true);
view.Ellipsize = null;
break;
case LineBreakMode.WordWrap:
view.SetSingleLine(false);
view.Ellipsize = null;
view.SetMaxLines(100);
break;
case LineBreakMode.CharacterWrap:
view.SetSingleLine(false);
view.Ellipsize = null;
view.SetMaxLines(100);
break;
case LineBreakMode.HeadTruncation:
view.SetSingleLine(true);
view.Ellipsize = TextUtils.TruncateAt.Start;
break;
case LineBreakMode.TailTruncation:
view.SetSingleLine(true);
view.Ellipsize = TextUtils.TruncateAt.End;
break;
case LineBreakMode.MiddleTruncation:
view.SetSingleLine(true);
view.Ellipsize = TextUtils.TruncateAt.Middle;
break;
}
}
private class DisclosureImage : ImageView
{
private ExtendedTextCell _cell;
public DisclosureImage(Context context, ExtendedTextCell cell) : base(context)
{
_cell = cell;
}
public override bool OnTouchEvent(MotionEvent e)
{
switch(e.Action)
{
case MotionEventActions.Up:
_cell.OnDisclousureTapped();
break;
default:
break;
}
return true;
}
}
}
}

View File

@@ -1,49 +0,0 @@
using Android.Content;
using System.ComponentModel;
using Android.Views;
using Bit.Android.Controls;
using Bit.App.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using AView = Android.Views.View;
[assembly: ExportRenderer(typeof(ExtendedViewCell), typeof(ExtendedViewCellRenderer))]
namespace Bit.Android.Controls
{
public class ExtendedViewCellRenderer : ViewCellRenderer
{
protected AView View { get; private set; }
protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context)
{
var View = base.GetCellCore(item, convertView, parent, context);
var extendedCell = (ExtendedViewCell)item;
if(View != null)
{
if(extendedCell.BackgroundColor != Color.White)
{
View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid());
}
else
{
View.SetBackgroundResource(Resource.Drawable.list_selector);
}
}
return View;
}
protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
{
base.OnCellPropertyChanged(sender, args);
var cell = (ExtendedViewCell)Cell;
if(args.PropertyName == ExtendedViewCell.BackgroundColorProperty.PropertyName)
{
View.SetBackgroundColor(cell.BackgroundColor.ToAndroid());
}
}
}
}

View File

@@ -0,0 +1,30 @@
using Android.Graphics.Drawables;
using Bit.App.Utilities;
using Bit.Droid.Effects;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportEffect(typeof(FabShadowEffect), "FabShadowEffect")]
namespace Bit.Droid.Effects
{
public class FabShadowEffect : PlatformEffect
{
protected override void OnAttached ()
{
if (Control is Android.Widget.Button button)
{
var gd = new GradientDrawable();
gd.SetColor(ThemeManager.GetResourceColor("FabColor").ToAndroid());
gd.SetCornerRadius(100);
button.SetBackground(gd);
button.Elevation = 6;
button.TranslationZ = 20;
}
}
protected override void OnDetached ()
{
}
}
}

View File

@@ -0,0 +1,23 @@
using Android.Widget;
using Bit.Droid.Effects;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportEffect(typeof(FixedSizeEffect), "FixedSizeEffect")]
namespace Bit.Droid.Effects
{
public class FixedSizeEffect : PlatformEffect
{
protected override void OnAttached()
{
if (Element is Label label && Control is TextView textView)
{
textView.SetTextSize(Android.Util.ComplexUnitType.Pt, (float)label.FontSize);
}
}
protected override void OnDetached()
{
}
}
}

View File

@@ -0,0 +1,23 @@
using Android.Widget;
using Bit.Droid.Effects;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportEffect(typeof(SelectableLabelEffect), "SelectableLabelEffect")]
namespace Bit.Droid.Effects
{
public class SelectableLabelEffect : PlatformEffect
{
protected override void OnAttached()
{
if (Control is TextView textView)
{
textView.SetTextIsSelectable(true);
}
}
protected override void OnDetached()
{
}
}
}

View File

@@ -0,0 +1,30 @@
using Android.Views;
using Bit.Droid.Effects;
using Google.Android.Material.BottomNavigation;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ResolutionGroupName("Bitwarden")]
[assembly: ExportEffect(typeof(TabBarEffect), "TabBarEffect")]
namespace Bit.Droid.Effects
{
public class TabBarEffect : PlatformEffect
{
protected override void OnAttached()
{
if (!(Container.GetChildAt(0) is ViewGroup layout))
{
return;
}
if (!(layout.GetChildAt(1) is BottomNavigationView bottomNavigationView))
{
return;
}
bottomNavigationView.LabelVisibilityMode = LabelVisibilityMode.LabelVisibilityLabeled;
}
protected override void OnDetached()
{
}
}
}

View File

@@ -1 +0,0 @@
XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler

View File

@@ -1,54 +0,0 @@
using HockeyApp.Android;
using Bit.App.Abstractions;
using Newtonsoft.Json;
using Android.Runtime;
namespace Bit.Android
{
public class HockeyAppCrashManagerListener : CrashManagerListener
{
private readonly IAppIdService _appIdService;
private readonly IAuthService _authService;
public HockeyAppCrashManagerListener()
{ }
public HockeyAppCrashManagerListener(System.IntPtr javaRef, JniHandleOwnership transfer)
: base(javaRef, transfer)
{ }
public HockeyAppCrashManagerListener(
IAppIdService appIdService,
IAuthService authService)
{
_appIdService = appIdService;
_authService = authService;
}
public override string Description
{
get
{
if(_appIdService != null && _authService != null)
{
var log = new
{
AppId = _appIdService.AppId,
UserId = _authService.UserId
};
return JsonConvert.SerializeObject(log, Formatting.Indented);
}
else
{
return null;
}
}
}
public override bool ShouldAutoUploadCrashes()
{
return true;
}
}
}

View File

@@ -1,144 +1,407 @@
using System;
using Android.App;
using Android.App;
using Android.Content.PM;
using Android.Views;
using Android.Runtime;
using Android.OS;
using Bit.Core;
using System.Linq;
using Bit.App.Abstractions;
using XLabs.Ioc;
using Plugin.Fingerprint.Abstractions;
using Plugin.Settings.Abstractions;
using Plugin.Connectivity.Abstractions;
using Acr.UserDialogs;
using Bit.Core.Utilities;
using Bit.Core.Abstractions;
using System.IO;
using System;
using Android.Content;
using System.Reflection;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;
using Bit.Droid.Utilities;
using Bit.Droid.Receivers;
using Bit.App.Models;
using Bit.Core.Enums;
using Android.Nfc;
using Bit.App.Utilities;
using System.Threading.Tasks;
using AndroidX.Core.Content;
namespace Bit.Android
namespace Bit.Droid
{
[Activity(Label = "bitwarden",
Icon = "@drawable/icon",
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
WindowSoftInputMode = SoftInput.StateHidden)]
public class MainActivity : FormsAppCompatActivity
[Activity(
Label = "Bitwarden",
Icon = "@mipmap/ic_launcher",
Theme = "@style/LightTheme.Splash",
MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
[Register("com.x8bit.bitwarden.MainActivity")]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
private const string HockeyAppId = "d3834185b4a643479047b86c65293d42";
private IDeviceActionService _deviceActionService;
private IMessagingService _messagingService;
private IBroadcasterService _broadcasterService;
private IUserService _userService;
private IAppIdService _appIdService;
private IStorageService _storageService;
private IEventService _eventService;
private PendingIntent _vaultTimeoutAlarmPendingIntent;
private PendingIntent _clearClipboardPendingIntent;
private PendingIntent _eventUploadPendingIntent;
private AppOptions _appOptions;
private string _activityKey = $"{nameof(MainActivity)}_{Java.Lang.JavaSystem.CurrentTimeMillis().ToString()}";
private Java.Util.Regex.Pattern _otpPattern =
Java.Util.Regex.Pattern.Compile("^.*?([cbdefghijklnrtuv]{32,64})$");
protected override void OnCreate(Bundle bundle)
protected override void OnCreate(Bundle savedInstanceState)
{
var eventUploadIntent = new Intent(this, typeof(EventUploadReceiver));
_eventUploadPendingIntent = PendingIntent.GetBroadcast(this, 0, eventUploadIntent,
PendingIntentFlags.UpdateCurrent);
var alarmIntent = new Intent(this, typeof(LockAlarmReceiver));
_vaultTimeoutAlarmPendingIntent = PendingIntent.GetBroadcast(this, 0, alarmIntent,
PendingIntentFlags.UpdateCurrent);
var clearClipboardIntent = new Intent(this, typeof(ClearClipboardAlarmReceiver));
_clearClipboardPendingIntent = PendingIntent.GetBroadcast(this, 0, clearClipboardIntent,
PendingIntentFlags.UpdateCurrent);
var policy = new StrictMode.ThreadPolicy.Builder().PermitAll().Build();
StrictMode.SetThreadPolicy(policy);
ToolbarResource = Resource.Layout.toolbar;
TabLayoutResource = Resource.Layout.tabs;
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
_userService = ServiceContainer.Resolve<IUserService>("userService");
_appIdService = ServiceContainer.Resolve<IAppIdService>("appIdService");
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
_eventService = ServiceContainer.Resolve<IEventService>("eventService");
base.OnCreate(bundle);
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
// workaround for app compat bug
// ref https://forums.xamarin.com/discussion/62414/app-resuming-results-in-crash-with-formsappcompatactivity
Task.Delay(10).Wait();
Console.WriteLine("A OnCreate");
Window.SetSoftInputMode(SoftInput.StateHidden);
Window.AddFlags(WindowManagerFlags.Secure);
var appIdService = Resolver.Resolve<IAppIdService>();
var authService = Resolver.Resolve<IAuthService>();
HockeyApp.Android.CrashManager.Register(this, HockeyAppId,
new HockeyAppCrashManagerListener(appIdService, authService));
Forms.Init(this, bundle);
typeof(Color).GetProperty("Accent", BindingFlags.Public | BindingFlags.Static)
.SetValue(null, Color.FromHex("d2d6de"));
LoadApplication(new App.App(
Resolver.Resolve<IAuthService>(),
Resolver.Resolve<IConnectivity>(),
Resolver.Resolve<IUserDialogs>(),
Resolver.Resolve<IDatabaseService>(),
Resolver.Resolve<ISyncService>(),
Resolver.Resolve<IFingerprint>(),
Resolver.Resolve<ISettings>(),
Resolver.Resolve<ILockService>(),
Resolver.Resolve<IGoogleAnalyticsService>(),
Resolver.Resolve<ILocalizeService>()));
MessagingCenter.Subscribe<Xamarin.Forms.Application>(Xamarin.Forms.Application.Current, "RateApp", (sender) =>
UpdateTheme(ThemeManager.GetTheme(true));
base.OnCreate(savedInstanceState);
if (!CoreHelpers.InDebugMode())
{
RateApp();
Window.AddFlags(Android.Views.WindowManagerFlags.Secure);
}
#if !FDROID
var appCenterHelper = new AppCenterHelper(_appIdService, _userService);
var appCenterTask = appCenterHelper.InitAsync();
#endif
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Xamarin.Forms.Forms.Init(this, savedInstanceState);
_appOptions = GetOptions();
LoadApplication(new App.App(_appOptions));
_broadcasterService.Subscribe(_activityKey, (message) =>
{
if (message.Command == "scheduleVaultTimeoutTimer")
{
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
var vaultTimeoutMinutes = (int)message.Data;
var vaultTimeoutMs = vaultTimeoutMinutes * 60000;
var triggerMs = Java.Lang.JavaSystem.CurrentTimeMillis() + vaultTimeoutMs + 10;
alarmManager.Set(AlarmType.RtcWakeup, triggerMs, _vaultTimeoutAlarmPendingIntent);
}
else if (message.Command == "cancelVaultTimeoutTimer")
{
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
alarmManager.Cancel(_vaultTimeoutAlarmPendingIntent);
}
else if (message.Command == "startEventTimer")
{
StartEventAlarm();
}
else if (message.Command == "stopEventTimer")
{
var task = StopEventAlarmAsync();
}
else if (message.Command == "finishMainActivity")
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(() => Finish());
}
else if (message.Command == "listenYubiKeyOTP")
{
ListenYubiKey((bool)message.Data);
}
else if (message.Command == "updatedTheme")
{
RestartApp();
}
else if (message.Command == "exit")
{
ExitApp();
}
else if (message.Command == "copiedToClipboard")
{
var task = ClearClipboardAlarmAsync(message.Data as Tuple<string, int?, bool>);
}
});
}
protected override void OnPause()
{
Console.WriteLine("A OnPause");
base.OnPause();
}
protected override void OnDestroy()
{
Console.WriteLine("A OnDestroy");
base.OnDestroy();
}
protected override void OnRestart()
{
Console.WriteLine("A OnRestart");
base.OnRestart();
}
protected override void OnStart()
{
Console.WriteLine("A OnStart");
base.OnStart();
}
protected override void OnStop()
{
Console.WriteLine("A OnStop");
base.OnStop();
ListenYubiKey(false);
}
protected override void OnResume()
{
Console.WriteLine("A OnResume");
base.OnResume();
}
public void RateApp()
if (_deviceActionService.SupportsNfc())
{
try
{
var rateIntent = RateIntentForUrl("market://details");
StartActivity(rateIntent);
_messagingService.Send("resumeYubiKey");
}
catch(ActivityNotFoundException)
{
var rateIntent = RateIntentForUrl("https://play.google.com/store/apps/details");
StartActivity(rateIntent);
catch { }
}
var setRestrictions = AndroidHelpers.SetPreconfiguredRestrictionSettingsAsync(this);
}
private Intent RateIntentForUrl(string url)
protected override void OnNewIntent(Intent intent)
{
var intent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse($"{url}?id={PackageName}"));
var flags = ActivityFlags.NoHistory | ActivityFlags.MultipleTask;
if((int)Build.VERSION.SdkInt >= 21)
base.OnNewIntent(intent);
if (intent.GetBooleanExtra("generatorTile", false))
{
flags |= ActivityFlags.NewDocument;
_messagingService.Send("popAllAndGoToTabGenerator");
if (_appOptions != null)
{
_appOptions.GeneratorTile = true;
}
}
if (intent.GetBooleanExtra("myVaultTile", false))
{
_messagingService.Send("popAllAndGoToTabMyVault");
if (_appOptions != null)
{
_appOptions.MyVaultTile = true;
}
}
else
{
// noinspection deprecation
flags |= ActivityFlags.ClearWhenTaskReset;
ParseYubiKey(intent.DataString);
}
}
intent.AddFlags(flags);
return intent;
public async override void OnRequestPermissionsResult(int requestCode, string[] permissions,
[GeneratedEnum] Permission[] grantResults)
{
if (requestCode == Constants.SelectFilePermissionRequestCode)
{
if (grantResults.Any(r => r != Permission.Granted))
{
_messagingService.Send("selectFileCameraPermissionDenied");
}
await _deviceActionService.SelectFileAsync();
}
else
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult(
requestCode, permissions, grantResults);
}
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (resultCode == Result.Ok &&
(requestCode == Constants.SelectFileRequestCode || requestCode == Constants.SaveFileRequestCode))
{
Android.Net.Uri uri = null;
string fileName = null;
if (data != null && data.Data != null)
{
uri = data.Data;
fileName = AndroidHelpers.GetFileName(ApplicationContext, uri);
}
else
{
// camera
var file = new Java.IO.File(FilesDir, "temp_camera_photo.jpg");
uri = FileProvider.GetUriForFile(this, "com.x8bit.bitwarden.fileprovider", file);
fileName = $"photo_{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}.jpg";
}
if (uri == null)
{
return;
}
if (requestCode == Constants.SaveFileRequestCode)
{
_messagingService.Send("selectSaveFileResult",
new Tuple<string, string>(uri.ToString(), fileName));
return;
}
try
{
using (var stream = ContentResolver.OpenInputStream(uri))
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
_messagingService.Send("selectFileResult",
new Tuple<byte[], string>(memoryStream.ToArray(), fileName ?? "unknown_file_name"));
}
}
catch (Java.IO.FileNotFoundException)
{
return;
}
}
}
protected override void OnDestroy()
{
base.OnDestroy();
_broadcasterService.Unsubscribe(_activityKey);
}
private void ListenYubiKey(bool listen)
{
if (!_deviceActionService.SupportsNfc())
{
return;
}
var adapter = NfcAdapter.GetDefaultAdapter(this);
if (listen)
{
var intent = new Intent(this, Class);
intent.AddFlags(ActivityFlags.SingleTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);
// register for all NDEF tags starting with http och https
var ndef = new IntentFilter(NfcAdapter.ActionNdefDiscovered);
ndef.AddDataScheme("http");
ndef.AddDataScheme("https");
var filters = new IntentFilter[] { ndef };
try
{
// register for foreground dispatch so we'll receive tags according to our intent filters
adapter.EnableForegroundDispatch(this, pendingIntent, filters, null);
}
catch { }
}
else
{
try
{
adapter.DisableForegroundDispatch(this);
}
catch { }
}
}
private AppOptions GetOptions()
{
var options = new AppOptions
{
Uri = Intent.GetStringExtra("uri") ?? Intent.GetStringExtra("autofillFrameworkUri"),
MyVaultTile = Intent.GetBooleanExtra("myVaultTile", false),
GeneratorTile = Intent.GetBooleanExtra("generatorTile", false),
FromAutofillFramework = Intent.GetBooleanExtra("autofillFramework", false)
};
var fillType = Intent.GetIntExtra("autofillFrameworkFillType", 0);
if (fillType > 0)
{
options.FillType = (CipherType)fillType;
}
if (Intent.GetBooleanExtra("autofillFrameworkSave", false))
{
options.SaveType = (CipherType)Intent.GetIntExtra("autofillFrameworkType", 0);
options.SaveName = Intent.GetStringExtra("autofillFrameworkName");
options.SaveUsername = Intent.GetStringExtra("autofillFrameworkUsername");
options.SavePassword = Intent.GetStringExtra("autofillFrameworkPassword");
options.SaveCardName = Intent.GetStringExtra("autofillFrameworkCardName");
options.SaveCardNumber = Intent.GetStringExtra("autofillFrameworkCardNumber");
options.SaveCardExpMonth = Intent.GetStringExtra("autofillFrameworkCardExpMonth");
options.SaveCardExpYear = Intent.GetStringExtra("autofillFrameworkCardExpYear");
options.SaveCardCode = Intent.GetStringExtra("autofillFrameworkCardCode");
}
return options;
}
private void ParseYubiKey(string data)
{
if (data == null)
{
return;
}
var otpMatch = _otpPattern.Matcher(data);
if (otpMatch.Matches())
{
var otp = otpMatch.Group(1);
_messagingService.Send("gotYubiKeyOTP", otp);
}
}
private void UpdateTheme(string theme)
{
if (theme == "dark")
{
SetTheme(Resource.Style.DarkTheme);
}
else if (theme == "black")
{
SetTheme(Resource.Style.BlackTheme);
}
else if (theme == "nord")
{
SetTheme(Resource.Style.NordTheme);
}
else
{
SetTheme(Resource.Style.LightTheme);
}
}
private void RestartApp()
{
var intent = new Intent(this, typeof(MainActivity));
var pendingIntent = PendingIntent.GetActivity(this, 5923650, intent, PendingIntentFlags.CancelCurrent);
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
var triggerMs = Java.Lang.JavaSystem.CurrentTimeMillis() + 500;
alarmManager.Set(AlarmType.Rtc, triggerMs, pendingIntent);
Java.Lang.JavaSystem.Exit(0);
}
private void ExitApp()
{
FinishAffinity();
Java.Lang.JavaSystem.Exit(0);
}
private async Task ClearClipboardAlarmAsync(Tuple<string, int?, bool> data)
{
if (data.Item3)
{
return;
}
var clearMs = data.Item2;
if (clearMs == null)
{
var clearSeconds = await _storageService.GetAsync<int?>(Constants.ClearClipboardKey);
if (clearSeconds != null)
{
clearMs = clearSeconds.Value * 1000;
}
}
if (clearMs == null)
{
return;
}
var triggerMs = Java.Lang.JavaSystem.CurrentTimeMillis() + clearMs.Value;
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
alarmManager.Set(AlarmType.Rtc, triggerMs, _clearClipboardPendingIntent);
}
private void StartEventAlarm()
{
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
alarmManager.SetInexactRepeating(AlarmType.ElapsedRealtime, 120000, 300000, _eventUploadPendingIntent);
}
private async Task StopEventAlarmAsync()
{
var alarmManager = GetSystemService(AlarmService) as AlarmManager;
alarmManager.Cancel(_eventUploadPendingIntent);
await _eventService.UploadEventsAsync();
}
}
}

View File

@@ -1,234 +1,146 @@
using System;
using Acr.UserDialogs;
using System;
using System.IO;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Bit.Android.Services;
using Bit.App.Abstractions;
using Bit.App.Repositories;
using Bit.App.Services;
using Microsoft.Practices.Unity;
using Plugin.Connectivity;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Bit.Droid.Services;
using Bit.Droid.Utilities;
using Plugin.CurrentActivity;
using Plugin.Fingerprint;
using Plugin.Settings;
using PushNotification.Plugin;
using PushNotification.Plugin.Abstractions;
using XLabs.Ioc;
using XLabs.Ioc.Unity;
using System.Threading.Tasks;
using Plugin.Settings.Abstractions;
using Xamarin.Android.Net;
#if !FDROID
using Android.Gms.Security;
#endif
namespace Bit.Android
namespace Bit.Droid
{
#if DEBUG
[Application(Debuggable = true)]
#else
[Application(Debuggable = false)]
#endif
public class MainApplication : Application, Application.IActivityLifecycleCallbacks
[Register("com.x8bit.bitwarden.MainApplication")]
#if FDROID
public class MainApplication : Application
#else
public class MainApplication : Application, ProviderInstaller.IProviderInstallListener
#endif
{
private const string FirstLaunchKey = "firstLaunch";
private const string LastVersionCodeKey = "lastVersionCode";
public static Context AppContext;
public MainApplication(IntPtr handle, JniHandleOwnership transer)
: base(handle, transer)
{
// NOTE: This is just here to stop the linker from removing AndroidClientHandler references
var handler = new AndroidClientHandler();
if(!Resolver.IsSet)
if (ServiceContainer.RegisteredServices.Count == 0)
{
SetIoc();
RegisterLocalServices();
var deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
ServiceContainer.Init(deviceActionService.DeviceUserAgent);
}
#if !FDROID
if (Build.VERSION.SdkInt <= BuildVersionCodes.Kitkat)
{
ProviderInstaller.InstallIfNeededAsync(ApplicationContext, this);
}
#endif
}
public override void OnCreate()
{
base.OnCreate();
// workaround for app compat bug
// ref https://forums.xamarin.com/discussion/62414/app-resuming-results-in-crash-with-formsappcompatactivity
Task.Delay(10).Wait();
RegisterActivityLifecycleCallbacks(this);
AppContext = ApplicationContext;
StartPushService();
HandlePushReregistration();
Bootstrap();
CrossCurrentActivity.Current.Init(this);
}
private void HandlePushReregistration()
public void OnProviderInstallFailed(int errorCode, Intent recoveryIntent)
{
var pushNotification = Resolver.Resolve<IPushNotification>();
var settings = Resolver.Resolve<ISettings>();
// Reregister for push token based on certain conditions
// ref https://github.com/rdelrosario/xamarin-plugins/issues/65
var reregister = false;
// 1. First time starting the app after a new install
if(settings.GetValueOrDefault(FirstLaunchKey, true))
{
settings.AddOrUpdateValue(FirstLaunchKey, false);
reregister = true;
}
// 2. App version changed (installed update)
var versionCode = Context.ApplicationContext.PackageManager.GetPackageInfo(Context.PackageName, 0).VersionCode;
if(settings.GetValueOrDefault(LastVersionCodeKey, -1) != versionCode)
public void OnProviderInstalled()
{
settings.AddOrUpdateValue(LastVersionCodeKey, versionCode);
reregister = true;
}
// 3. In debug mode
if(InDebugMode())
private void RegisterLocalServices()
{
reregister = true;
}
ServiceContainer.Register<ILogService>("logService", new AndroidLogService());
// 4. Doesn't have a push token currently
if(string.IsNullOrWhiteSpace(pushNotification.Token))
// Note: This might cause a race condition. Investigate more.
Task.Run(() =>
{
reregister = true;
}
FFImageLoading.Forms.Platform.CachedImageRenderer.Init(true);
FFImageLoading.ImageService.Instance.Initialize(new FFImageLoading.Config.Configuration
{
FadeAnimationEnabled = false,
FadeAnimationForCachedImages = false
});
ZXing.Net.Mobile.Forms.Android.Platform.Init();
});
CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity);
if(reregister)
{
pushNotification.Unregister();
if(Resolver.Resolve<IAuthService>().IsAuthenticated)
{
pushNotification.Register();
}
}
}
var preferencesStorage = new PreferencesStorageService(null);
var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var liteDbStorage = new LiteDbStorageService(Path.Combine(documentsPath, "bitwarden.db"));
liteDbStorage.InitAsync();
var localizeService = new LocalizeService();
var broadcasterService = new BroadcasterService();
var messagingService = new MobileBroadcasterMessagingService(broadcasterService);
var i18nService = new MobileI18nService(localizeService.GetCurrentCultureInfo());
var secureStorageService = new SecureStorageService();
var cryptoPrimitiveService = new CryptoPrimitiveService();
var mobileStorageService = new MobileStorageService(preferencesStorage, liteDbStorage);
var deviceActionService = new DeviceActionService(mobileStorageService, messagingService,
broadcasterService, () => ServiceContainer.Resolve<IEventService>("eventService"));
var platformUtilsService = new MobilePlatformUtilsService(deviceActionService, messagingService,
broadcasterService);
private bool InDebugMode()
{
#if DEBUG
return true;
ServiceContainer.Register<IBroadcasterService>("broadcasterService", broadcasterService);
ServiceContainer.Register<IMessagingService>("messagingService", messagingService);
ServiceContainer.Register<ILocalizeService>("localizeService", localizeService);
ServiceContainer.Register<II18nService>("i18nService", i18nService);
ServiceContainer.Register<ICryptoPrimitiveService>("cryptoPrimitiveService", cryptoPrimitiveService);
ServiceContainer.Register<IStorageService>("storageService", mobileStorageService);
ServiceContainer.Register<IStorageService>("secureStorageService", secureStorageService);
ServiceContainer.Register<IDeviceActionService>("deviceActionService", deviceActionService);
ServiceContainer.Register<IPlatformUtilsService>("platformUtilsService", platformUtilsService);
// Push
#if FDROID
ServiceContainer.Register<IPushNotificationListenerService>(
"pushNotificationListenerService", new NoopPushNotificationListenerService());
ServiceContainer.Register<IPushNotificationService>(
"pushNotificationService", new NoopPushNotificationService());
#else
return false;
var notificationListenerService = new PushNotificationListenerService();
ServiceContainer.Register<IPushNotificationListenerService>(
"pushNotificationListenerService", notificationListenerService);
var androidPushNotificationService = new AndroidPushNotificationService(
mobileStorageService, notificationListenerService);
ServiceContainer.Register<IPushNotificationService>(
"pushNotificationService", androidPushNotificationService);
#endif
}
public override void OnTerminate()
private void Bootstrap()
{
base.OnTerminate();
UnregisterActivityLifecycleCallbacks(this);
(ServiceContainer.Resolve<II18nService>("i18nService") as MobileI18nService).Init();
ServiceContainer.Resolve<IAuthService>("authService").Init();
// Note: This is not awaited
var bootstrapTask = BootstrapAsync();
}
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
private async Task BootstrapAsync()
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivityDestroyed(Activity activity)
{
}
public void OnActivityPaused(Activity activity)
{
}
public void OnActivityResumed(Activity activity)
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
{
}
public void OnActivityStarted(Activity activity)
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivityStopped(Activity activity)
{
}
public static void StartPushService()
{
AppContext.StartService(new Intent(AppContext, typeof(PushNotificationService)));
if(Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext,
typeof(PushNotificationService)), 0);
AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(AlarmService);
alarm.Cancel(pintent);
}
}
public static void StopPushService()
{
AppContext.StopService(new Intent(AppContext, typeof(PushNotificationService)));
if(Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext,
typeof(PushNotificationService)), 0);
AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(AlarmService);
alarm.Cancel(pintent);
}
}
private void SetIoc()
{
UserDialogs.Init(this);
var container = new UnityContainer();
container
// Android Stuff
.RegisterInstance(ApplicationContext)
.RegisterInstance<Application>(this)
// Services
.RegisterType<IDatabaseService, DatabaseService>(new ContainerControlledLifetimeManager())
.RegisterType<ISqlService, SqlService>(new ContainerControlledLifetimeManager())
.RegisterType<ISecureStorageService, KeyStoreStorageService>(new ContainerControlledLifetimeManager())
.RegisterType<ICryptoService, CryptoService>(new ContainerControlledLifetimeManager())
.RegisterType<IKeyDerivationService, BouncyCastleKeyDerivationService>(new ContainerControlledLifetimeManager())
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
.RegisterType<IReflectionService, ReflectionService>(new ContainerControlledLifetimeManager())
.RegisterType<ILockService, LockService>(new ContainerControlledLifetimeManager())
.RegisterType<IAppInfoService, AppInfoService>(new ContainerControlledLifetimeManager())
.RegisterType<IGoogleAnalyticsService, GoogleAnalyticsService>(new ContainerControlledLifetimeManager())
.RegisterType<IDeviceInfoService, DeviceInfoService>(new ContainerControlledLifetimeManager())
.RegisterType<ILocalizeService, LocalizeService>(new ContainerControlledLifetimeManager())
.RegisterType<ILogService, LogService>(new ContainerControlledLifetimeManager())
// Repositories
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
.RegisterType<ICipherApiRepository, CipherApiRepository>(new ContainerControlledLifetimeManager())
// Other
.RegisterInstance(CrossSettings.Current, new ContainerControlledLifetimeManager())
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
.RegisterInstance(UserDialogs.Instance, new ContainerControlledLifetimeManager())
.RegisterInstance(CrossFingerprint.Current, new ContainerControlledLifetimeManager());
CrossPushNotification.Initialize(container.Resolve<IPushNotificationListener>(), "962181367620");
container.RegisterInstance(CrossPushNotification.Current, new ContainerControlledLifetimeManager());
Resolver.SetResolver(new UnityResolver(container));
CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity);
var disableFavicon = await ServiceContainer.Resolve<IStorageService>("storageService")
.GetAsync<bool?>(Constants.DisableFaviconKey);
await ServiceContainer.Resolve<IStateService>("stateService").SaveAsync(
Constants.DisableFaviconKey, disableFavicon);
await ServiceContainer.Resolve<IEnvironmentService>("environmentService").SetUrlsFromStorageAsync();
}
}
}

View File

@@ -1,13 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.x8bit.bitwarden" android:versionName="1.2.0" android:installLocation="auto" android:versionCode="9">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23" />
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="1"
android:versionName="2.5.5"
package="com.x8bit.bitwarden">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.x8bit.bitwarden.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<application android:label="bitwarden" android:theme="@style/BitwardenTheme"></application>
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<application
android:label="Bitwarden"
android:theme="@style/LightTheme.Splash"
android:allowBackup="false"
tools:replace="android:allowBackup"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:networkSecurityConfig="@xml/network_security_config">
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.x8bit.bitwarden.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.x8bit.bitwarden" />
</intent-filter>
</receiver>
<meta-data android:name="android.max_aspect" android:value="2.1" />
<meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions" />
<!-- Support for Samsung "Multi Window" mode (for Android < 7.0 users) -->
<meta-data android:name="com.samsung.android.sdk.multiwindow.enable" android:value="true" />
<meta-data android:name="com.samsung.android.sdk.multiwindow.penwindow.enable" android:value="true" />
<!-- Support for LG "Dual Window" mode (for Android < 7.0 users) -->
<meta-data android:name="com.lge.support.SPLIT_WINDOW" android:value="true" />
</application>
</manifest>

View File

@@ -1,7 +1,5 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Android.App;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
@@ -9,8 +7,8 @@ using Android.App;
[assembly: AssemblyTitle("BitwardenAndroid")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("8bit Solutions LLC")]
[assembly: AssemblyProduct("bitwarden")]
[assembly: AssemblyCompany("Bitwarden Inc.")]
[assembly: AssemblyProduct("Bitwarden")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -28,7 +26,3 @@ using Android.App;
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
// Add some common permissions, these can be removed if not needed
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]

View File

@@ -0,0 +1,25 @@
#if !FDROID
using Android.App;
using Android.Content;
using Bit.App.Abstractions;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
using Firebase.Iid;
namespace Bit.Droid.Push
{
[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class FirebaseInstanceIdService : Firebase.Iid.FirebaseInstanceIdService
{
public async override void OnTokenRefresh()
{
var storageService = ServiceContainer.Resolve<IStorageService>("storageService");
var pushNotificationService = ServiceContainer.Resolve<IPushNotificationService>("pushNotificationService");
await storageService.SaveAsync(Constants.PushRegisteredTokenKey, FirebaseInstanceId.Instance.Token);
await pushNotificationService.RegisterAsync();
}
}
}
#endif

View File

@@ -0,0 +1,42 @@
#if !FDROID
using Android.App;
using Android.Content;
using Bit.App.Abstractions;
using Bit.Core.Utilities;
using Firebase.Messaging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Xamarin.Forms;
namespace Bit.Droid.Push
{
[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class FirebaseMessagingService : Firebase.Messaging.FirebaseMessagingService
{
public async override void OnMessageReceived(RemoteMessage message)
{
if (message?.Data == null)
{
return;
}
var data = message.Data.ContainsKey("data") ? message.Data["data"] : null;
if (data == null)
{
return;
}
try
{
var obj = JObject.Parse(data);
var listener = ServiceContainer.Resolve<IPushNotificationListenerService>(
"pushNotificationListenerService");
await listener.OnMessageAsync(obj, Device.Android);
}
catch (JsonReaderException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
}
}
#endif

View File

@@ -0,0 +1,14 @@
using Android.Content;
namespace Bit.Droid.Receivers
{
[BroadcastReceiver(Name = "com.x8bit.bitwarden.ClearClipboardAlarmReceiver", Exported = false)]
public class ClearClipboardAlarmReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var clipboardManager = context.GetSystemService(Context.ClipboardService) as ClipboardManager;
clipboardManager.PrimaryClip = ClipData.NewPlainText("bitwarden", string.Empty);
}
}
}

View File

@@ -0,0 +1,16 @@
using Android.Content;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
namespace Bit.Droid.Receivers
{
[BroadcastReceiver(Name = "com.x8bit.bitwarden.EventUploadReceiver", Exported = false)]
public class EventUploadReceiver : BroadcastReceiver
{
public async override void OnReceive(Context context, Intent intent)
{
var eventService = ServiceContainer.Resolve<IEventService>("eventService");
await eventService.UploadEventsAsync();
}
}
}

View File

@@ -0,0 +1,16 @@
using Android.Content;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
namespace Bit.Droid.Receivers
{
[BroadcastReceiver(Name = "com.x8bit.bitwarden.LockAlarmReceiver", Exported = false)]
public class LockAlarmReceiver : BroadcastReceiver
{
public async override void OnReceive(Context context, Intent intent)
{
var vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
await vaultTimeoutService.CheckVaultTimeoutAsync();
}
}
}

View File

@@ -0,0 +1,22 @@
using System;
using Android.App;
using Android.Content;
using Bit.App.Abstractions;
using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
namespace Bit.Droid.Receivers
{
[BroadcastReceiver(Name = "com.x8bit.bitwarden.PackageReplacedReceiver", Exported = false)]
[IntentFilter(new[] { Intent.ActionMyPackageReplaced })]
public class PackageReplacedReceiver : BroadcastReceiver
{
public override async void OnReceive(Context context, Intent intent)
{
var storageService = ServiceContainer.Resolve<IStorageService>("storageService");
await AppHelpers.PerformUpdateTasksAsync(ServiceContainer.Resolve<ISyncService>("syncService"),
ServiceContainer.Resolve<IDeviceActionService>("deviceActionService"), storageService);
}
}
}

View File

@@ -0,0 +1,23 @@
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
using Bit.Droid.Utilities;
namespace Bit.Droid.Receivers
{
[BroadcastReceiver(Name = "com.x8bit.bitwarden.RestrictionsChangedReceiver", Exported = false)]
[IntentFilter(new[] { Intent.ActionApplicationRestrictionsChanged })]
public class RestrictionsChangedReceiver : BroadcastReceiver
{
public async override void OnReceive(Context context, Intent intent)
{
if (intent.Action == Intent.ActionApplicationRestrictionsChanged)
{
await AndroidHelpers.SetPreconfiguredRestrictionSettingsAsync(context);
}
}
}
}

View File

@@ -0,0 +1,238 @@
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Views.InputMethods;
using Android.Widget;
using Bit.App.Controls;
using Bit.App.Utilities;
using Bit.Droid.Renderers;
using FFImageLoading;
using FFImageLoading.Views;
using FFImageLoading.Work;
using System;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CipherViewCell), typeof(CipherViewCellRenderer))]
namespace Bit.Droid.Renderers
{
public class CipherViewCellRenderer : ViewCellRenderer
{
private static Typeface _faTypeface;
private static Typeface _miTypeface;
private static Android.Graphics.Color _textColor;
private static Android.Graphics.Color _mutedColor;
private static Android.Graphics.Color _disabledIconColor;
private AndroidCipherCell _cell;
protected override Android.Views.View GetCellCore(Cell item, Android.Views.View convertView,
ViewGroup parent, Context context)
{
if (_faTypeface == null)
{
_faTypeface = Typeface.CreateFromAsset(context.Assets, "FontAwesome.ttf");
}
if (_miTypeface == null)
{
_miTypeface = Typeface.CreateFromAsset(context.Assets, "MaterialIcons_Regular.ttf");
}
if (_textColor == default(Android.Graphics.Color))
{
_textColor = ThemeManager.GetResourceColor("TextColor").ToAndroid();
}
if (_mutedColor == default(Android.Graphics.Color))
{
_mutedColor = ThemeManager.GetResourceColor("MutedColor").ToAndroid();
}
if (_disabledIconColor == default(Android.Graphics.Color))
{
_disabledIconColor = ThemeManager.GetResourceColor("DisabledIconColor").ToAndroid();
}
var cipherCell = item as CipherViewCell;
_cell = convertView as AndroidCipherCell;
if (_cell == null)
{
_cell = new AndroidCipherCell(context, cipherCell, _faTypeface, _miTypeface);
}
else
{
_cell.CipherViewCell.PropertyChanged -= CellPropertyChanged;
}
cipherCell.PropertyChanged += CellPropertyChanged;
_cell.UpdateCell(cipherCell);
_cell.UpdateColors(_textColor, _mutedColor, _disabledIconColor);
return _cell;
}
public void CellPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var cipherCell = sender as CipherViewCell;
_cell.CipherViewCell = cipherCell;
if (e.PropertyName == CipherViewCell.CipherProperty.PropertyName)
{
_cell.UpdateCell(cipherCell);
}
else if (e.PropertyName == CipherViewCell.WebsiteIconsEnabledProperty.PropertyName)
{
_cell.UpdateIconImage(cipherCell);
}
}
}
public class AndroidCipherCell : LinearLayout, INativeElementView
{
private readonly Typeface _faTypeface;
private readonly Typeface _miTypeface;
private IScheduledWork _currentTask;
public AndroidCipherCell(Context context, CipherViewCell cipherView, Typeface faTypeface, Typeface miTypeface)
: base(context)
{
CipherViewCell = cipherView;
_faTypeface = faTypeface;
_miTypeface = miTypeface;
var view = (context as Activity).LayoutInflater.Inflate(Resource.Layout.CipherViewCell, null);
IconImage = view.FindViewById<IconImageView>(Resource.Id.CipherCellIconImage);
Icon = view.FindViewById<TextView>(Resource.Id.CipherCellIcon);
Name = view.FindViewById<TextView>(Resource.Id.CipherCellName);
SubTitle = view.FindViewById<TextView>(Resource.Id.CipherCellSubTitle);
SharedIcon = view.FindViewById<TextView>(Resource.Id.CipherCellSharedIcon);
AttachmentsIcon = view.FindViewById<TextView>(Resource.Id.CipherCellAttachmentsIcon);
MoreButton = view.FindViewById<Android.Widget.Button>(Resource.Id.CipherCellButton);
MoreButton.Click += MoreButton_Click;
Icon.Typeface = _faTypeface;
SharedIcon.Typeface = _faTypeface;
AttachmentsIcon.Typeface = _faTypeface;
MoreButton.Typeface = _miTypeface;
var small = (float)Device.GetNamedSize(NamedSize.Small, typeof(Label));
Icon.SetTextSize(ComplexUnitType.Pt, 10);
Name.SetTextSize(ComplexUnitType.Sp, (float)Device.GetNamedSize(NamedSize.Medium, typeof(Label)));
SubTitle.SetTextSize(ComplexUnitType.Sp, small);
SharedIcon.SetTextSize(ComplexUnitType.Sp, small);
AttachmentsIcon.SetTextSize(ComplexUnitType.Sp, small);
MoreButton.SetTextSize(ComplexUnitType.Sp, 25);
AddView(view);
}
public CipherViewCell CipherViewCell { get; set; }
public Element Element => CipherViewCell;
public IconImageView IconImage { get; set; }
public TextView Icon { get; set; }
public TextView Name { get; set; }
public TextView SubTitle { get; set; }
public TextView SharedIcon { get; set; }
public TextView AttachmentsIcon { get; set; }
public Android.Widget.Button MoreButton { get; set; }
public void UpdateCell(CipherViewCell cipherCell)
{
UpdateIconImage(cipherCell);
var cipher = cipherCell.Cipher;
Name.Text = cipher.Name;
if (!string.IsNullOrWhiteSpace(cipher.SubTitle))
{
SubTitle.Text = cipher.SubTitle;
SubTitle.Visibility = ViewStates.Visible;
}
else
{
SubTitle.Visibility = ViewStates.Invisible;
}
SharedIcon.Visibility = cipher.Shared ? ViewStates.Visible : ViewStates.Gone;
AttachmentsIcon.Visibility = cipher.HasAttachments ? ViewStates.Visible : ViewStates.Gone;
}
public void UpdateIconImage(CipherViewCell cipherCell)
{
if (_currentTask != null && !_currentTask.IsCancelled && !_currentTask.IsCompleted)
{
_currentTask.Cancel();
}
var cipher = cipherCell.Cipher;
var iconImage = cipherCell.GetIconImage(cipher);
if (iconImage.Item2 != null)
{
IconImage.SetImageResource(Resource.Drawable.login);
IconImage.Visibility = ViewStates.Visible;
Icon.Visibility = ViewStates.Gone;
_currentTask = ImageService.Instance.LoadUrl(iconImage.Item2).DownSample(64).Into(IconImage);
IconImage.Key = iconImage.Item2;
}
else
{
IconImage.Visibility = ViewStates.Gone;
Icon.Visibility = ViewStates.Visible;
Icon.Text = iconImage.Item1;
}
}
public void UpdateColors(Android.Graphics.Color textColor, Android.Graphics.Color mutedColor,
Android.Graphics.Color iconDisabledColor)
{
Name.SetTextColor(textColor);
SubTitle.SetTextColor(mutedColor);
Icon.SetTextColor(mutedColor);
SharedIcon.SetTextColor(mutedColor);
AttachmentsIcon.SetTextColor(mutedColor);
MoreButton.SetTextColor(iconDisabledColor);
}
private void MoreButton_Click(object sender, EventArgs e)
{
if (CipherViewCell.ButtonCommand?.CanExecute(CipherViewCell.Cipher) ?? false)
{
CipherViewCell.ButtonCommand.Execute(CipherViewCell.Cipher);
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
MoreButton.Click -= MoreButton_Click;
}
base.Dispose(disposing);
}
}
[Android.Runtime.Preserve(AllMembers = true)]
[Register("bit.droid.renderers.IconImageView")]
public class IconImageView : ImageViewAsync
{
public IconImageView(Context context) : base(context)
{ }
public IconImageView(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{ }
public IconImageView(Context context, IAttributeSet attrs)
: base(context, attrs)
{ }
public string Key { get; set; }
protected override void JavaFinalize()
{
SetImageDrawable(null);
SetImageBitmap(null);
ImageService.Instance.InvalidateCacheEntryAsync(Key, FFImageLoading.Cache.CacheType.Memory);
base.JavaFinalize();
}
}
}

View File

@@ -0,0 +1,37 @@
using Android.Content;
using Android.Views.InputMethods;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Editor), typeof(CustomEditorRenderer))]
namespace Bit.Droid.Renderers
{
public class CustomEditorRenderer : EditorRenderer
{
public CustomEditorRenderer(Context context)
: base(context)
{ }
// Workaround for issue described here:
// https://github.com/xamarin/Xamarin.Forms/issues/8291#issuecomment-617456651
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
EditText.Enabled = false;
EditText.Enabled = true;
}
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null)
{
Control.SetPadding(Control.PaddingLeft, Control.PaddingTop - 10, Control.PaddingRight,
Control.PaddingBottom + 20);
Control.ImeOptions = Control.ImeOptions | (ImeAction)ImeFlags.NoPersonalizedLearning |
(ImeAction)ImeFlags.NoExtractUi;
}
}
}
}

View File

@@ -0,0 +1,69 @@
using System.ComponentModel;
using Android.Content;
using Android.Graphics;
using Android.Text;
using Android.Views.InputMethods;
using Android.Widget;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer))]
namespace Bit.Droid.Renderers
{
public class CustomEntryRenderer : EntryRenderer
{
public CustomEntryRenderer(Context context)
: base(context)
{ }
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null)
{
Control.SetPadding(Control.PaddingLeft, Control.PaddingTop - 10, Control.PaddingRight,
Control.PaddingBottom + 20);
Control.ImeOptions = Control.ImeOptions | (ImeAction)ImeFlags.NoPersonalizedLearning |
(ImeAction)ImeFlags.NoExtractUi;
}
}
// Workaround for failure to disable text prediction on non-password fields
// see https://github.com/xamarin/Xamarin.Forms/issues/10857
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
// Check if changed property is "IsPassword", otherwise ignore
if (e.PropertyName == Entry.IsPasswordProperty.PropertyName)
{
// Check if field type is text, otherwise ignore (numeric passwords, etc.)
EditText.InputType = Element.Keyboard.ToInputType();
if ((EditText.InputType & InputTypes.ClassText) == InputTypes.ClassText)
{
if (Element.IsPassword)
{
// Element is a password field, set inputType to TextVariationPassword which disables
// predictive text by default
EditText.InputType = EditText.InputType | InputTypes.TextVariationPassword;
}
else
{
// Element is not a password field, set inputType to TextVariationVisiblePassword to
// disable predictive text while still displaying the content.
EditText.InputType = EditText.InputType | InputTypes.TextVariationVisiblePassword;
}
// The workaround above forces a reset of the style properties, so we need to re-apply the font.
// see https://xamarin.github.io/bugzilla-archives/33/33666/bug.html
var typeface = Typeface.CreateFromAsset(Context.Assets, "RobotoMono_Regular.ttf");
if (Control is TextView label)
{
label.Typeface = typeface;
}
}
}
}
}
}

View File

@@ -0,0 +1,25 @@
using Android.Content;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]
namespace Bit.Droid.Renderers
{
public class CustomPickerRenderer : PickerRenderer
{
public CustomPickerRenderer(Context context)
: base(context)
{ }
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null)
{
Control.SetPadding(Control.PaddingLeft, Control.PaddingTop - 10, Control.PaddingRight,
Control.PaddingBottom + 20);
}
}
}
}

View File

@@ -0,0 +1,33 @@
using Android.Content;
using Android.Views.InputMethods;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(SearchBar), typeof(CustomSearchBarRenderer))]
namespace Bit.Droid.Renderers
{
public class CustomSearchBarRenderer : SearchBarRenderer
{
public CustomSearchBarRenderer(Context context)
: base(context)
{ }
protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null)
{
try
{
var magId = Resources.GetIdentifier("android:id/search_mag_icon", null, null);
var magImage = (Android.Widget.ImageView)Control.FindViewById(magId);
magImage.LayoutParameters = new Android.Widget.LinearLayout.LayoutParams(0, 0);
}
catch { }
Control.SetImeOptions(Control.ImeOptions | (ImeAction)ImeFlags.NoPersonalizedLearning |
(ImeAction)ImeFlags.NoExtractUi);
}
}
}
}

View File

@@ -0,0 +1,29 @@
using Android.Content;
using Android.Views;
using Bit.App.Controls;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedListView), typeof(ExtendedListViewRenderer))]
namespace Bit.Droid.Renderers
{
public class ExtendedListViewRenderer : ListViewRenderer
{
public ExtendedListViewRenderer(Context context)
: base(context)
{ }
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
if (Control != null && e.NewElement != null && e.NewElement is ExtendedListView listView)
{
// Pad for FAB
Control.SetPadding(0, 0, 0, 170);
Control.SetClipToPadding(false);
Control.ScrollBarStyle = ScrollbarStyles.OutsideOverlay;
}
}
}
}

View File

@@ -0,0 +1,40 @@
using Android.Content;
using Android.Graphics.Drawables;
using AndroidX.Core.Content.Resources;
using Bit.App.Controls;
using Bit.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ExtendedSlider), typeof(ExtendedSliderRenderer))]
namespace Bit.Droid.Renderers
{
public class ExtendedSliderRenderer : SliderRenderer
{
public ExtendedSliderRenderer(Context context)
: base(context)
{}
protected override void OnElementChanged(ElementChangedEventArgs<Slider> e)
{
base.OnElementChanged(e);
if (Control != null && Element is ExtendedSlider view)
{
var t = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.slider_thumb, null);
if (t is GradientDrawable thumb)
{
if (view.ThumbColor == Color.Default)
{
thumb.SetColor(Color.White.ToAndroid());
}
else
{
thumb.SetColor(view.ThumbColor.ToAndroid());
}
thumb.SetStroke(3, view.ThumbBorderColor.ToAndroid());
Control.SetThumb(thumb);
}
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More