From 297beac169f8307a468ae924a962ecaedcdb50ce Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 27 Mar 2019 16:23:00 -0400 Subject: [PATCH 001/315] reset for v2 --- appveyor.yml | 29 - bitwarden-mobile.sln | 523 - src/Android/8bit.keystore.enc | Bin 2288 -> 0 bytes src/Android/Android.csproj | 1025 -- src/Android/Assets/AboutAssets.txt | 19 - src/Android/Autofill/AutofillHelpers.cs | 183 - src/Android/Autofill/AutofillService.cs | 112 - src/Android/Autofill/Field.cs | 199 - src/Android/Autofill/FieldCollection.cs | 348 - src/Android/Autofill/FilledItem.cs | 273 - src/Android/Autofill/Parser.cs | 136 - src/Android/Autofill/SavedItem.cs | 26 - src/Android/AutofillActivity.cs | 110 - src/Android/AutofillCredentials.cs | 10 - src/Android/AutofillService.cs | 546 - src/Android/Controls/CustomButtonRenderer.cs | 35 - src/Android/Controls/CustomLabelRenderer.cs | 21 - .../Controls/CustomSearchBarRenderer.cs | 23 - src/Android/Controls/CustomSliderRenderer.cs | 27 - .../Controls/ExtendedButtonRenderer.cs | 67 - .../Controls/ExtendedEditorRenderer.cs | 86 - src/Android/Controls/ExtendedEntryRenderer.cs | 217 - .../Controls/ExtendedListViewRenderer.cs | 33 - .../Controls/ExtendedPickerRenderer.cs | 54 - .../Controls/ExtendedSwitchCellRenderer.cs | 72 - .../Controls/ExtendedTabbedPageRenderer.cs | 441 - .../Controls/ExtendedTableViewRenderer.cs | 184 - .../Controls/ExtendedTextCellRenderer.cs | 155 - .../Controls/ExtendedViewCellRenderer.cs | 49 - src/Android/Controls/HybridWebViewRenderer.cs | 89 - src/Android/FirebaseInstanceIdService.cs | 25 - src/Android/FirebaseMessagingService.cs | 44 - src/Android/HockeyAppCrashManagerListener.cs | 56 - src/Android/MainActivity.cs | 302 - src/Android/MainApplication.cs | 147 - src/Android/MyVaultTileService.cs | 58 - .../Naxam.Ittianyu.BottomNavExtension.dll | Bin 81408 -> 0 bytes src/Android/PackageReplacedReceiver.cs | 23 - src/Android/Properties/AndroidManifest.xml | 42 - src/Android/Properties/AssemblyInfo.cs | 30 - src/Android/Resources/AboutResources.txt | 50 - src/Android/Resources/Resource.Designer.cs | 10763 ------------- .../accessibility_notification.png | Bin 13127 -> 0 bytes .../accessibility_notification_icon.png | Bin 7320 -> 0 bytes .../drawable-hdpi/accessibility_step1.png | Bin 12689 -> 0 bytes .../drawable-hdpi/accessibility_step2.png | Bin 7764 -> 0 bytes .../Resources/drawable-hdpi/android.png | Bin 530 -> 0 bytes src/Android/Resources/drawable-hdpi/apple.png | Bin 625 -> 0 bytes .../drawable-hdpi/autofill_enable.png | Bin 9948 -> 0 bytes .../Resources/drawable-hdpi/autofill_use.png | Bin 13097 -> 0 bytes .../Resources/drawable-hdpi/camera.png | Bin 664 -> 0 bytes src/Android/Resources/drawable-hdpi/card.png | Bin 180 -> 0 bytes .../Resources/drawable-hdpi/clipboard.png | Bin 426 -> 0 bytes .../Resources/drawable-hdpi/cloudup.png | Bin 977 -> 0 bytes src/Android/Resources/drawable-hdpi/cog.png | Bin 883 -> 0 bytes .../Resources/drawable-hdpi/cog_alt.png | Bin 738 -> 0 bytes src/Android/Resources/drawable-hdpi/cogs.png | Bin 1318 -> 0 bytes src/Android/Resources/drawable-hdpi/cube.png | Bin 738 -> 0 bytes .../Resources/drawable-hdpi/download.png | Bin 467 -> 0 bytes .../Resources/drawable-hdpi/envelope.png | Bin 518 -> 0 bytes src/Android/Resources/drawable-hdpi/eye.png | Bin 833 -> 0 bytes .../Resources/drawable-hdpi/eye_slash.png | Bin 937 -> 0 bytes .../Resources/drawable-hdpi/fa_lock.png | Bin 569 -> 0 bytes .../Resources/drawable-hdpi/fingerprint.png | Bin 6192 -> 0 bytes .../Resources/drawable-hdpi/folder.png | Bin 431 -> 0 bytes .../Resources/drawable-hdpi/folder_o.png | Bin 482 -> 0 bytes src/Android/Resources/drawable-hdpi/globe.png | Bin 1671 -> 0 bytes src/Android/Resources/drawable-hdpi/icon.png | Bin 1301 -> 0 bytes src/Android/Resources/drawable-hdpi/id.png | Bin 487 -> 0 bytes .../drawable-hdpi/ion_chevron_right.png | Bin 513 -> 0 bytes .../Resources/drawable-hdpi/launch.png | Bin 686 -> 0 bytes .../Resources/drawable-hdpi/lightbulb.png | Bin 634 -> 0 bytes src/Android/Resources/drawable-hdpi/lock.png | Bin 438 -> 0 bytes src/Android/Resources/drawable-hdpi/login.png | Bin 904 -> 0 bytes src/Android/Resources/drawable-hdpi/logo.png | Bin 6997 -> 0 bytes src/Android/Resources/drawable-hdpi/more.png | Bin 218 -> 0 bytes src/Android/Resources/drawable-hdpi/note.png | Bin 344 -> 0 bytes .../drawable-hdpi/notification_sm.png | Bin 531 -> 0 bytes .../Resources/drawable-hdpi/paperclip.png | Bin 658 -> 0 bytes .../Resources/drawable-hdpi/pencil.png | Bin 495 -> 0 bytes src/Android/Resources/drawable-hdpi/plus.png | Bin 130 -> 0 bytes .../Resources/drawable-hdpi/refresh.png | Bin 926 -> 0 bytes .../Resources/drawable-hdpi/refresh_alt.png | Bin 804 -> 0 bytes .../Resources/drawable-hdpi/search.png | Bin 519 -> 0 bytes src/Android/Resources/drawable-hdpi/share.png | Bin 403 -> 0 bytes .../Resources/drawable-hdpi/share_tools.png | Bin 1009 -> 0 bytes src/Android/Resources/drawable-hdpi/tools.png | Bin 637 -> 0 bytes src/Android/Resources/drawable-hdpi/trash.png | Bin 452 -> 0 bytes .../Resources/drawable-hdpi/upload.png | Bin 708 -> 0 bytes .../Resources/drawable-hdpi/upload2.png | Bin 1113 -> 0 bytes src/Android/Resources/drawable-hdpi/user.png | Bin 572 -> 0 bytes .../Resources/drawable-hdpi/yubikey.png | Bin 110977 -> 0 bytes .../accessibility_notification.png | Bin 19349 -> 0 bytes .../accessibility_notification_icon.png | Bin 10079 -> 0 bytes .../drawable-xhdpi/accessibility_step1.png | Bin 18229 -> 0 bytes .../drawable-xhdpi/accessibility_step2.png | Bin 10839 -> 0 bytes .../Resources/drawable-xhdpi/android.png | Bin 659 -> 0 bytes .../Resources/drawable-xhdpi/apple.png | Bin 741 -> 0 bytes .../drawable-xhdpi/autofill_enable.png | Bin 14352 -> 0 bytes .../Resources/drawable-xhdpi/autofill_use.png | Bin 19160 -> 0 bytes .../Resources/drawable-xhdpi/camera.png | Bin 802 -> 0 bytes src/Android/Resources/drawable-xhdpi/card.png | Bin 326 -> 0 bytes .../Resources/drawable-xhdpi/clipboard.png | Bin 487 -> 0 bytes .../Resources/drawable-xhdpi/cloudup.png | Bin 1273 -> 0 bytes src/Android/Resources/drawable-xhdpi/cog.png | Bin 1058 -> 0 bytes .../Resources/drawable-xhdpi/cog_alt.png | Bin 1005 -> 0 bytes src/Android/Resources/drawable-xhdpi/cogs.png | Bin 1524 -> 0 bytes src/Android/Resources/drawable-xhdpi/cube.png | Bin 941 -> 0 bytes .../Resources/drawable-xhdpi/download.png | Bin 556 -> 0 bytes .../Resources/drawable-xhdpi/envelope.png | Bin 629 -> 0 bytes src/Android/Resources/drawable-xhdpi/eye.png | Bin 1056 -> 0 bytes .../Resources/drawable-xhdpi/eye_slash.png | Bin 1204 -> 0 bytes .../Resources/drawable-xhdpi/fa_lock.png | Bin 680 -> 0 bytes .../Resources/drawable-xhdpi/fingerprint.png | Bin 8554 -> 0 bytes .../Resources/drawable-xhdpi/folder.png | Bin 598 -> 0 bytes .../Resources/drawable-xhdpi/folder_o.png | Bin 686 -> 0 bytes .../Resources/drawable-xhdpi/globe.png | Bin 2051 -> 0 bytes src/Android/Resources/drawable-xhdpi/icon.png | Bin 1721 -> 0 bytes src/Android/Resources/drawable-xhdpi/id.png | Bin 545 -> 0 bytes .../drawable-xhdpi/ion_chevron_right.png | Bin 509 -> 0 bytes .../Resources/drawable-xhdpi/launch.png | Bin 910 -> 0 bytes .../Resources/drawable-xhdpi/lightbulb.png | Bin 789 -> 0 bytes src/Android/Resources/drawable-xhdpi/lock.png | Bin 569 -> 0 bytes .../Resources/drawable-xhdpi/login.png | Bin 1172 -> 0 bytes src/Android/Resources/drawable-xhdpi/more.png | Bin 284 -> 0 bytes src/Android/Resources/drawable-xhdpi/note.png | Bin 382 -> 0 bytes .../drawable-xhdpi/notification_sm.png | Bin 586 -> 0 bytes .../Resources/drawable-xhdpi/paperclip.png | Bin 802 -> 0 bytes .../Resources/drawable-xhdpi/pencil.png | Bin 359 -> 0 bytes src/Android/Resources/drawable-xhdpi/plus.png | Bin 133 -> 0 bytes .../Resources/drawable-xhdpi/refresh.png | Bin 1110 -> 0 bytes .../Resources/drawable-xhdpi/refresh_alt.png | Bin 1017 -> 0 bytes .../Resources/drawable-xhdpi/search.png | Bin 693 -> 0 bytes .../Resources/drawable-xhdpi/share.png | Bin 503 -> 0 bytes .../Resources/drawable-xhdpi/share_tools.png | Bin 1302 -> 0 bytes .../Resources/drawable-xhdpi/tools.png | Bin 750 -> 0 bytes .../Resources/drawable-xhdpi/trash.png | Bin 390 -> 0 bytes .../Resources/drawable-xhdpi/upload.png | Bin 969 -> 0 bytes .../Resources/drawable-xhdpi/upload2.png | Bin 1243 -> 0 bytes src/Android/Resources/drawable-xhdpi/user.png | Bin 685 -> 0 bytes .../Resources/drawable-xhdpi/yubikey.png | Bin 191579 -> 0 bytes .../accessibility_notification.png | Bin 21134 -> 0 bytes .../accessibility_notification_icon.png | Bin 11175 -> 0 bytes .../drawable-xxhdpi/accessibility_step1.png | Bin 16983 -> 0 bytes .../drawable-xxhdpi/accessibility_step2.png | Bin 11821 -> 0 bytes .../Resources/drawable-xxhdpi/android.png | Bin 994 -> 0 bytes .../Resources/drawable-xxhdpi/apple.png | Bin 1005 -> 0 bytes .../drawable-xxhdpi/autofill_enable.png | Bin 24257 -> 0 bytes .../drawable-xxhdpi/autofill_use.png | Bin 33456 -> 0 bytes .../Resources/drawable-xxhdpi/camera.png | Bin 1208 -> 0 bytes .../Resources/drawable-xxhdpi/card.png | Bin 234 -> 0 bytes .../Resources/drawable-xxhdpi/clipboard.png | Bin 677 -> 0 bytes .../Resources/drawable-xxhdpi/cloudup.png | Bin 1703 -> 0 bytes src/Android/Resources/drawable-xxhdpi/cog.png | Bin 1415 -> 0 bytes .../Resources/drawable-xxhdpi/cog_alt.png | Bin 1239 -> 0 bytes .../Resources/drawable-xxhdpi/cogs.png | Bin 2082 -> 0 bytes .../Resources/drawable-xxhdpi/cube.png | Bin 1206 -> 0 bytes .../Resources/drawable-xxhdpi/download.png | Bin 707 -> 0 bytes .../Resources/drawable-xxhdpi/envelope.png | Bin 884 -> 0 bytes src/Android/Resources/drawable-xxhdpi/eye.png | Bin 1448 -> 0 bytes .../Resources/drawable-xxhdpi/eye_slash.png | Bin 1608 -> 0 bytes .../Resources/drawable-xxhdpi/fa_lock.png | Bin 810 -> 0 bytes .../Resources/drawable-xxhdpi/fingerprint.png | Bin 13475 -> 0 bytes .../Resources/drawable-xxhdpi/folder.png | Bin 810 -> 0 bytes .../Resources/drawable-xxhdpi/folder_o.png | Bin 816 -> 0 bytes .../Resources/drawable-xxhdpi/globe.png | Bin 2803 -> 0 bytes .../Resources/drawable-xxhdpi/icon.png | Bin 2748 -> 0 bytes src/Android/Resources/drawable-xxhdpi/id.png | Bin 868 -> 0 bytes .../drawable-xxhdpi/ion_chevron_right.png | Bin 777 -> 0 bytes .../Resources/drawable-xxhdpi/launch.png | Bin 1207 -> 0 bytes .../Resources/drawable-xxhdpi/lightbulb.png | Bin 1164 -> 0 bytes .../Resources/drawable-xxhdpi/lock.png | Bin 733 -> 0 bytes .../Resources/drawable-xxhdpi/login.png | Bin 1588 -> 0 bytes .../Resources/drawable-xxhdpi/logo.png | Bin 8426 -> 0 bytes .../Resources/drawable-xxhdpi/more.png | Bin 400 -> 0 bytes .../Resources/drawable-xxhdpi/note.png | Bin 359 -> 0 bytes .../drawable-xxhdpi/notification_sm.png | Bin 773 -> 0 bytes .../Resources/drawable-xxhdpi/paperclip.png | Bin 1151 -> 0 bytes .../Resources/drawable-xxhdpi/pencil.png | Bin 571 -> 0 bytes .../Resources/drawable-xxhdpi/plus.png | Bin 140 -> 0 bytes .../Resources/drawable-xxhdpi/refresh.png | Bin 1457 -> 0 bytes .../Resources/drawable-xxhdpi/refresh_alt.png | Bin 1320 -> 0 bytes .../Resources/drawable-xxhdpi/search.png | Bin 957 -> 0 bytes .../Resources/drawable-xxhdpi/share.png | Bin 649 -> 0 bytes .../Resources/drawable-xxhdpi/share_tools.png | Bin 1495 -> 0 bytes .../Resources/drawable-xxhdpi/tools.png | Bin 1087 -> 0 bytes .../Resources/drawable-xxhdpi/trash.png | Bin 534 -> 0 bytes .../Resources/drawable-xxhdpi/upload.png | Bin 1195 -> 0 bytes .../Resources/drawable-xxhdpi/upload2.png | Bin 2185 -> 0 bytes .../Resources/drawable-xxhdpi/user.png | Bin 895 -> 0 bytes .../Resources/drawable-xxhdpi/yubikey.png | Bin 390403 -> 0 bytes .../Resources/drawable-xxxhdpi/android.png | Bin 1227 -> 0 bytes .../Resources/drawable-xxxhdpi/apple.png | Bin 1224 -> 0 bytes .../Resources/drawable-xxxhdpi/camera.png | Bin 1411 -> 0 bytes .../Resources/drawable-xxxhdpi/card.png | Bin 469 -> 0 bytes .../Resources/drawable-xxxhdpi/clipboard.png | Bin 737 -> 0 bytes .../Resources/drawable-xxxhdpi/cloudup.png | Bin 2013 -> 0 bytes .../Resources/drawable-xxxhdpi/cog.png | Bin 1700 -> 0 bytes .../Resources/drawable-xxxhdpi/cog_alt.png | Bin 1551 -> 0 bytes .../Resources/drawable-xxxhdpi/cogs.png | Bin 2548 -> 0 bytes .../Resources/drawable-xxxhdpi/cube.png | Bin 1497 -> 0 bytes .../Resources/drawable-xxxhdpi/download.png | Bin 690 -> 0 bytes .../Resources/drawable-xxxhdpi/envelope.png | Bin 1053 -> 0 bytes .../Resources/drawable-xxxhdpi/eye.png | Bin 1742 -> 0 bytes .../Resources/drawable-xxxhdpi/eye_slash.png | Bin 1955 -> 0 bytes .../Resources/drawable-xxxhdpi/fa_lock.png | Bin 1100 -> 0 bytes .../drawable-xxxhdpi/fingerprint.png | Bin 19473 -> 0 bytes .../Resources/drawable-xxxhdpi/folder.png | Bin 1009 -> 0 bytes .../Resources/drawable-xxxhdpi/folder_o.png | Bin 1165 -> 0 bytes .../Resources/drawable-xxxhdpi/globe.png | Bin 3540 -> 0 bytes .../Resources/drawable-xxxhdpi/icon.png | Bin 3679 -> 0 bytes src/Android/Resources/drawable-xxxhdpi/id.png | Bin 807 -> 0 bytes .../drawable-xxxhdpi/ion_chevron_right.png | Bin 881 -> 0 bytes .../Resources/drawable-xxxhdpi/launch.png | Bin 1512 -> 0 bytes .../Resources/drawable-xxxhdpi/lightbulb.png | Bin 1402 -> 0 bytes .../Resources/drawable-xxxhdpi/lock.png | Bin 810 -> 0 bytes .../Resources/drawable-xxxhdpi/login.png | Bin 1917 -> 0 bytes .../Resources/drawable-xxxhdpi/more.png | Bin 488 -> 0 bytes .../Resources/drawable-xxxhdpi/note.png | Bin 524 -> 0 bytes .../drawable-xxxhdpi/notification_sm.png | Bin 1038 -> 0 bytes .../Resources/drawable-xxxhdpi/paperclip.png | Bin 1496 -> 0 bytes .../Resources/drawable-xxxhdpi/pencil.png | Bin 681 -> 0 bytes .../Resources/drawable-xxxhdpi/plus.png | Bin 150 -> 0 bytes .../Resources/drawable-xxxhdpi/refresh.png | Bin 1771 -> 0 bytes .../drawable-xxxhdpi/refresh_alt.png | Bin 1675 -> 0 bytes .../Resources/drawable-xxxhdpi/search.png | Bin 1293 -> 0 bytes .../Resources/drawable-xxxhdpi/share.png | Bin 1047 -> 0 bytes .../drawable-xxxhdpi/share_tools.png | Bin 2397 -> 0 bytes .../Resources/drawable-xxxhdpi/tools.png | Bin 1373 -> 0 bytes .../Resources/drawable-xxxhdpi/trash.png | Bin 552 -> 0 bytes .../Resources/drawable-xxxhdpi/upload.png | Bin 1421 -> 0 bytes .../Resources/drawable-xxxhdpi/upload2.png | Bin 1948 -> 0 bytes .../Resources/drawable-xxxhdpi/user.png | Bin 1183 -> 0 bytes .../drawable/accessibility_notification.png | Bin 8221 -> 0 bytes .../accessibility_notification_icon.png | Bin 4786 -> 0 bytes .../drawable/accessibility_step1.png | Bin 7819 -> 0 bytes .../drawable/accessibility_step2.png | Bin 5051 -> 0 bytes src/Android/Resources/drawable/android.png | Bin 406 -> 0 bytes src/Android/Resources/drawable/apple.png | Bin 446 -> 0 bytes .../Resources/drawable/autofill_enable.png | Bin 5938 -> 0 bytes .../Resources/drawable/autofill_use.png | Bin 7669 -> 0 bytes .../Resources/drawable/bottom_nav_bg.xml | 13 - src/Android/Resources/drawable/camera.png | Bin 478 -> 0 bytes src/Android/Resources/drawable/card.png | Bin 229 -> 0 bytes src/Android/Resources/drawable/clipboard.png | Bin 350 -> 0 bytes src/Android/Resources/drawable/cloudup.png | Bin 779 -> 0 bytes src/Android/Resources/drawable/cog.png | Bin 610 -> 0 bytes src/Android/Resources/drawable/cog_alt.png | Bin 590 -> 0 bytes src/Android/Resources/drawable/cogs.png | Bin 878 -> 0 bytes src/Android/Resources/drawable/cube.png | Bin 533 -> 0 bytes src/Android/Resources/drawable/download.png | Bin 378 -> 0 bytes src/Android/Resources/drawable/envelope.png | Bin 374 -> 0 bytes src/Android/Resources/drawable/eye.png | Bin 607 -> 0 bytes src/Android/Resources/drawable/eye_slash.png | Bin 659 -> 0 bytes src/Android/Resources/drawable/fa_lock.png | Bin 398 -> 0 bytes .../Resources/drawable/fingerprint.png | Bin 3956 -> 0 bytes src/Android/Resources/drawable/folder.png | Bin 388 -> 0 bytes src/Android/Resources/drawable/folder_o.png | Bin 401 -> 0 bytes src/Android/Resources/drawable/globe.png | Bin 1255 -> 0 bytes src/Android/Resources/drawable/icon.png | Bin 941 -> 0 bytes src/Android/Resources/drawable/id.png | Bin 342 -> 0 bytes .../Resources/drawable/ion_chevron_right.png | Bin 340 -> 0 bytes src/Android/Resources/drawable/launch.png | Bin 596 -> 0 bytes src/Android/Resources/drawable/lightbulb.png | Bin 468 -> 0 bytes .../Resources/drawable/list_selector.xml | 5 - src/Android/Resources/drawable/lock.png | Bin 359 -> 0 bytes src/Android/Resources/drawable/login.png | Bin 657 -> 0 bytes src/Android/Resources/drawable/logo.png | Bin 2593 -> 0 bytes src/Android/Resources/drawable/more.png | Bin 165 -> 0 bytes src/Android/Resources/drawable/note.png | Bin 272 -> 0 bytes .../Resources/drawable/notification_sm.png | Bin 364 -> 0 bytes src/Android/Resources/drawable/paperclip.png | Bin 249 -> 0 bytes src/Android/Resources/drawable/pencil.png | Bin 339 -> 0 bytes src/Android/Resources/drawable/plus.png | Bin 155 -> 0 bytes src/Android/Resources/drawable/refresh.png | Bin 593 -> 0 bytes .../Resources/drawable/refresh_alt.png | Bin 583 -> 0 bytes src/Android/Resources/drawable/search.png | Bin 449 -> 0 bytes src/Android/Resources/drawable/share.png | Bin 298 -> 0 bytes .../Resources/drawable/share_tools.png | Bin 817 -> 0 bytes src/Android/Resources/drawable/shield.png | Bin 2298 -> 0 bytes .../Resources/drawable/slider_thumb.xml | 6 - .../Resources/drawable/splash_screen.xml | 9 - src/Android/Resources/drawable/tools.png | Bin 480 -> 0 bytes src/Android/Resources/drawable/upload.png | Bin 533 -> 0 bytes src/Android/Resources/drawable/upload2.png | Bin 689 -> 0 bytes src/Android/Resources/drawable/user.png | Bin 425 -> 0 bytes src/Android/Resources/drawable/yubikey.png | Bin 52442 -> 0 bytes .../Resources/layout/autofill_listitem.axml | 40 - src/Android/Resources/layout/tabs.axml | 11 - src/Android/Resources/layout/toolbar.axml | 8 - .../mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../Resources/mipmap-hdpi/ic_launcher.png | Bin 1266 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 941 -> 0 bytes .../mipmap-hdpi/ic_launcher_round.png | Bin 3224 -> 0 bytes .../Resources/mipmap-mdpi/ic_launcher.png | Bin 896 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 608 -> 0 bytes .../mipmap-mdpi/ic_launcher_round.png | Bin 1870 -> 0 bytes .../Resources/mipmap-xhdpi/ic_launcher.png | Bin 1769 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 1307 -> 0 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 4460 -> 0 bytes .../Resources/mipmap-xxhdpi/ic_launcher.png | Bin 2718 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 2117 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 8808 -> 0 bytes .../Resources/mipmap-xxxhdpi/ic_launcher.png | Bin 3863 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 3178 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 11586 -> 0 bytes src/Android/Resources/values-v21/styles.xml | 5 - src/Android/Resources/values/colors.xml | 12 - .../values/ic_launcher_background.xml | 4 - src/Android/Resources/values/strings.xml | 16 - src/Android/Resources/values/styles.xml | 18 - .../Resources/xml/accessibilityservice.xml | 9 - src/Android/Resources/xml/autofillservice.xml | 78 - src/Android/Resources/xml/filepaths.xml | 4 - .../Resources/xml/network_security_config.xml | 17 - .../Services/AndroidKeyStoreStorageService.cs | 369 - .../AndroidPushNotificationService.cs | 44 - src/Android/Services/AppInfoService.cs | 41 - .../BouncyCastleKeyDerivationService.cs | 20 - src/Android/Services/DeviceActionService.cs | 591 - src/Android/Services/DeviceInfoService.cs | 75 - .../Services/GoogleAnalyticsService.cs | 51 - src/Android/Services/HttpService.cs | 13 - src/Android/Services/LocalizeService.cs | 112 - src/Android/Services/LogService.cs | 13 - src/Android/Services/SqlService.cs | 29 - src/Android/SplashActivity.cs | 34 - src/Android/Utilities.cs | 121 - src/Android/ci-build-apks.ps1 | 87 - src/Android/google-services.json | 42 - src/Android/google-services.json.enc | Bin 1520 -> 0 bytes src/Android/update-android.ps1 | 13 - src/App/Abstractions/IDataObject.cs | 9 - src/App/Abstractions/ITreeNodeObject.cs | 8 - .../Repositories/IAccountsApiRepository.cs | 15 - .../Repositories/IApiRepository.cs | 19 - .../Repositories/IAttachmentRepository.cs | 13 - .../Repositories/ICipherApiRepository.cs | 12 - .../ICipherCollectionRepository.cs | 15 - .../Repositories/ICipherRepository.cs | 13 - .../Repositories/ICollectionRepository.cs | 11 - .../Repositories/IConnectApiRepository.cs | 10 - .../Repositories/IDeviceApiRepository.cs | 14 - .../Repositories/IFolderApiRepository.cs | 10 - .../Repositories/IFolderRepository.cs | 13 - .../Abstractions/Repositories/IRepository.cs | 19 - .../Repositories/ISettingsApiRepository.cs | 10 - .../Repositories/ISettingsRepository.cs | 8 - .../Repositories/ISyncApiRepository.cs | 10 - .../Repositories/ITwoFactorApiRepository.cs | 10 - .../Abstractions/Services/IAppIdService.cs | 8 - .../Abstractions/Services/IAppInfoService.cs | 10 - .../Services/IAppSettingsService.cs | 24 - src/App/Abstractions/Services/IAuthService.cs | 23 - .../Abstractions/Services/ICipherService.cs | 28 - .../Services/ICollectionService.cs | 14 - .../Abstractions/Services/ICryptoService.cs | 32 - .../Abstractions/Services/IDatabaseService.cs | 7 - .../Services/IDeviceActionService.cs | 28 - .../Services/IDeviceInfoService.cs | 15 - .../Abstractions/Services/IFolderService.cs | 15 - .../Services/IGoogleAnalyticsService.cs | 16 - src/App/Abstractions/Services/IHttpService.cs | 8 - .../Services/IKeyDerivationService.cs | 7 - .../Abstractions/Services/ILocalizeService.cs | 31 - src/App/Abstractions/Services/ILockService.cs | 14 - src/App/Abstractions/Services/ILogService.cs | 7 - .../Services/IPasswordGenerationService.cs | 17 - .../Services/IPushNotification.cs | 9 - .../Services/IPushNotificationListener.cs | 13 - .../Services/ISecureStorageService.cs | 10 - .../Abstractions/Services/ISettingsService.cs | 10 - src/App/Abstractions/Services/ISqlService.cs | 9 - src/App/Abstractions/Services/ISyncService.cs | 18 - .../Abstractions/Services/ITokenService.cs | 21 - src/App/App.cs | 327 - src/App/App.csproj | 292 - src/App/Constants.cs | 56 - src/App/Controls/AddCipherToolBarItem.cs | 16 - src/App/Controls/DismissModalToolBarItem.cs | 29 - src/App/Controls/ExtendedButton.cs | 28 - src/App/Controls/ExtendedContentPage.cs | 81 - src/App/Controls/ExtendedEditor.cs | 17 - src/App/Controls/ExtendedEntry.cs | 86 - src/App/Controls/ExtendedListView.cs | 16 - src/App/Controls/ExtendedNavigationPage.cs | 27 - src/App/Controls/ExtendedPicker.cs | 19 - src/App/Controls/ExtendedSwitchCell.cs | 16 - src/App/Controls/ExtendedTabbedPage.cs | 24 - src/App/Controls/ExtendedTableView.cs | 80 - src/App/Controls/ExtendedTextCell.cs | 60 - src/App/Controls/ExtendedToolbarItem.cs | 30 - src/App/Controls/ExtendedViewCell.cs | 26 - src/App/Controls/Fab.cs | 24 - src/App/Controls/FabLayout.cs | 16 - src/App/Controls/FormEditorCell.cs | 52 - src/App/Controls/FormEntryCell.cs | 225 - src/App/Controls/FormPickerCell.cs | 65 - src/App/Controls/FormSwitchCell.cs | 47 - src/App/Controls/HybridWebView.cs | 34 - src/App/Controls/LabeledDetailCell.cs | 94 - src/App/Controls/LabeledRightDetailCell.cs | 59 - src/App/Controls/LabeledValueCell.cs | 138 - src/App/Controls/PinControl.cs | 61 - src/App/Controls/RedrawableStackLayout.cs | 27 - src/App/Controls/SectionHeaderViewCell.cs | 45 - src/App/Controls/StepperCell.cs | 83 - src/App/Controls/VaultAttachmentsViewCell.cs | 22 - src/App/Controls/VaultGroupingViewCell.cs | 74 - src/App/Controls/VaultListViewCell.cs | 84 - src/App/Enums/CipherType.cs | 12 - src/App/Enums/DeviceType.cs | 9 - src/App/Enums/EncryptionType.cs | 13 - src/App/Enums/FieldType.cs | 9 - src/App/Enums/KdfType.cs | 7 - src/App/Enums/LockType.cs | 10 - src/App/Enums/OrganizationUserStatusType.cs | 9 - src/App/Enums/OrganizationUserType.cs | 9 - src/App/Enums/PushType.cs | 20 - src/App/Enums/ReturnType.cs | 11 - src/App/Enums/SecureNoteType.cs | 7 - src/App/Enums/TwoFactorProviderType.cs | 13 - src/App/Enums/UriMatchType.cs | 12 - src/App/Models/Api/ApiError.cs | 9 - src/App/Models/Api/ApiResult.cs | 75 - src/App/Models/Api/CardType.cs | 24 - src/App/Models/Api/FieldType.cs | 18 - src/App/Models/Api/IdentityType.cs | 48 - src/App/Models/Api/LoginType.cs | 26 - src/App/Models/Api/LoginUriType.cs | 18 - src/App/Models/Api/Request/CipherRequest.cs | 61 - src/App/Models/Api/Request/DeviceRequest.cs | 23 - .../Models/Api/Request/DeviceTokenRequest.cs | 12 - src/App/Models/Api/Request/FolderRequest.cs | 12 - .../Models/Api/Request/PasswordHintRequest.cs | 7 - .../Api/Request/PasswordHistoryRequest.cs | 14 - src/App/Models/Api/Request/PreloginRequest.cs | 7 - src/App/Models/Api/Request/RegisterRequest.cs | 15 - src/App/Models/Api/Request/TokenRequest.cs | 45 - .../Api/Request/TwoFactorEmailRequest.cs | 8 - .../Models/Api/Response/AttachmentResponse.cs | 12 - src/App/Models/Api/Response/CipherResponse.cs | 29 - .../Models/Api/Response/CollectionResponse.cs | 9 - src/App/Models/Api/Response/DeviceResponse.cs | 14 - .../Models/Api/Response/DomainsResponse.cs | 17 - src/App/Models/Api/Response/ErrorResponse.cs | 14 - src/App/Models/Api/Response/FolderResponse.cs | 11 - src/App/Models/Api/Response/KeysResponse.cs | 8 - src/App/Models/Api/Response/ListResponse.cs | 14 - .../Api/Response/PasswordHistoryResponse.cs | 8 - .../Models/Api/Response/PreloginResponse.cs | 10 - .../Response/ProfileOrganizationResponse.cs | 23 - .../Models/Api/Response/ProfileResponse.cs | 20 - src/App/Models/Api/Response/SyncResponse.cs | 13 - src/App/Models/Api/Response/TokenResponse.cs | 22 - src/App/Models/Api/SecureNoteType.cs | 14 - src/App/Models/AppOptions.cs | 21 - src/App/Models/Attachment.cs | 49 - src/App/Models/Card.cs | 43 - src/App/Models/Cipher.cs | 92 - src/App/Models/CipherString.cs | 135 - src/App/Models/Collection.cs | 29 - src/App/Models/Data/AttachmentData.cs | 51 - src/App/Models/Data/CipherCollectionData.cs | 18 - src/App/Models/Data/CipherData.cs | 102 - .../Models/Data/CipherData/CardDataModel.cs | 33 - .../Models/Data/CipherData/CipherDataModel.cs | 24 - .../Models/Data/CipherData/FieldDataModel.cs | 20 - .../Data/CipherData/IdentityDataModel.cs | 57 - .../Models/Data/CipherData/LoginDataModel.cs | 40 - .../Data/CipherData/LoginUriDataModel.cs | 19 - .../CipherData/PasswordHistoryDataModel.cs | 18 - .../Data/CipherData/SecureNoteDataModel.cs | 23 - src/App/Models/Data/CollectionData.cs | 36 - src/App/Models/Data/FolderData.cs | 36 - src/App/Models/Data/SettingsData.cs | 16 - src/App/Models/DomainName.cs | 348 - src/App/Models/Field.cs | 21 - src/App/Models/Folder.cs | 36 - src/App/Models/Identity.cs | 68 - src/App/Models/Login.cs | 42 - src/App/Models/LoginResult.cs | 19 - src/App/Models/LoginUri.cs | 19 - src/App/Models/OtpAuth.cs | 65 - src/App/Models/Page/AppExtensionPageModel.cs | 47 - .../Models/Page/PasswordGeneratorPageModel.cs | 40 - src/App/Models/Page/PinPageModel.cs | 36 - .../Models/Page/SettingsFolderPageModel.cs | 14 - .../Models/Page/VaultAttachmentsPageModel.cs | 25 - src/App/Models/Page/VaultListPageModel.cs | 245 - .../Models/Page/VaultViewCipherPageModel.cs | 750 - src/App/Models/PasswordHistory.cs | 18 - src/App/Models/PlatformCulture.cs | 43 - src/App/Models/PushNotification.cs | 38 - src/App/Models/SecureNote.cs | 33 - src/App/Models/SymmetricCryptoKey.cs | 62 - src/App/Models/TreeNode.cs | 19 - src/App/Pages/EnvironmentPage.cs | 266 - src/App/Pages/HomePage.cs | 146 - src/App/Pages/Lock/BaseLockPage.cs | 38 - src/App/Pages/Lock/LockFingerprintPage.cs | 133 - src/App/Pages/Lock/LockPasswordPage.cs | 174 - src/App/Pages/Lock/LockPinPage.cs | 150 - src/App/Pages/LoginPage.cs | 207 - src/App/Pages/LoginTwoFactorPage.cs | 614 - src/App/Pages/MainPage.cs | 35 - src/App/Pages/PasswordHintPage.cs | 143 - src/App/Pages/RegisterPage.cs | 240 - src/App/Pages/ScanPage.cs | 162 - src/App/Pages/Settings/SettingsAboutPage.cs | 110 - .../Pages/Settings/SettingsAddFolderPage.cs | 134 - src/App/Pages/Settings/SettingsCreditsPage.cs | 85 - .../Pages/Settings/SettingsEditFolderPage.cs | 184 - src/App/Pages/Settings/SettingsHelpPage.cs | 180 - .../Pages/Settings/SettingsListFoldersPage.cs | 118 - src/App/Pages/Settings/SettingsOptionsPage.cs | 310 - src/App/Pages/Settings/SettingsPage.cs | 552 - src/App/Pages/Settings/SettingsPinPage.cs | 92 - src/App/Pages/Settings/SettingsSyncPage.cs | 122 - .../Tools/ToolsAccessibilityServicePage.cs | 236 - src/App/Pages/Tools/ToolsAutofillPage.cs | 113 - .../Pages/Tools/ToolsAutofillServicePage.cs | 170 - src/App/Pages/Tools/ToolsExtensionPage.cs | 230 - src/App/Pages/Tools/ToolsPage.cs | 260 - .../Pages/Tools/ToolsPasswordGeneratorPage.cs | 459 - src/App/Pages/Vault/VaultAddCipherPage.cs | 855 -- src/App/Pages/Vault/VaultAttachmentsPage.cs | 334 - .../Vault/VaultAutofillListCiphersPage.cs | 337 - src/App/Pages/Vault/VaultEditCipherPage.cs | 981 -- src/App/Pages/Vault/VaultListCiphersPage.cs | 547 - src/App/Pages/Vault/VaultListGroupingsPage.cs | 367 - src/App/Pages/Vault/VaultViewCipherPage.cs | 666 - src/App/Repositories/AccountsApiRepository.cs | 210 - src/App/Repositories/ApiRepository.cs | 222 - src/App/Repositories/AttachmentRepository.cs | 37 - src/App/Repositories/BaseApiRepository.cs | 195 - src/App/Repositories/BaseRepository.cs | 15 - src/App/Repositories/CipherApiRepository.cs | 108 - .../CipherCollectionRepository.cs | 47 - src/App/Repositories/CipherRepository.cs | 29 - src/App/Repositories/CollectionRepository.cs | 21 - src/App/Repositories/ConnectApiRepository.cs | 78 - src/App/Repositories/DeviceApiRepository.cs | 94 - src/App/Repositories/FolderApiRepository.cs | 19 - src/App/Repositories/FolderRepository.cs | 40 - src/App/Repositories/Repository.cs | 56 - src/App/Repositories/SettingsApiRepository.cs | 63 - src/App/Repositories/SettingsRepository.cs | 12 - src/App/Repositories/SyncApiRepository.cs | 63 - .../Repositories/TwoFactorApiRepository.cs | 53 - src/App/Resources/AppResources.Designer.cs | 3501 ----- src/App/Resources/AppResources.bg.resx | 1349 -- src/App/Resources/AppResources.cs.Designer.cs | 0 src/App/Resources/AppResources.cs.resx | 1349 -- src/App/Resources/AppResources.da.Designer.cs | 0 src/App/Resources/AppResources.da.resx | 1349 -- src/App/Resources/AppResources.de.Designer.cs | 0 src/App/Resources/AppResources.de.resx | 1349 -- src/App/Resources/AppResources.en-GB.resx | 1349 -- src/App/Resources/AppResources.es.Designer.cs | 0 src/App/Resources/AppResources.es.resx | 1349 -- src/App/Resources/AppResources.et.resx | 1349 -- src/App/Resources/AppResources.fa.resx | 1349 -- src/App/Resources/AppResources.fi.Designer.cs | 0 src/App/Resources/AppResources.fi.resx | 1349 -- src/App/Resources/AppResources.fr.Designer.cs | 0 src/App/Resources/AppResources.fr.resx | 1349 -- src/App/Resources/AppResources.hi.Designer.cs | 0 src/App/Resources/AppResources.hi.resx | 1349 -- src/App/Resources/AppResources.hr.Designer.cs | 0 src/App/Resources/AppResources.hr.resx | 1349 -- src/App/Resources/AppResources.hu.Designer.cs | 0 src/App/Resources/AppResources.hu.resx | 1349 -- src/App/Resources/AppResources.id.Designer.cs | 0 src/App/Resources/AppResources.id.resx | 1349 -- src/App/Resources/AppResources.it.Designer.cs | 0 src/App/Resources/AppResources.it.resx | 1349 -- src/App/Resources/AppResources.ja.Designer.cs | 0 src/App/Resources/AppResources.ja.resx | 1349 -- src/App/Resources/AppResources.ko.resx | 1349 -- src/App/Resources/AppResources.nb.resx | 1349 -- src/App/Resources/AppResources.nl.Designer.cs | 0 src/App/Resources/AppResources.nl.resx | 1349 -- src/App/Resources/AppResources.pl.Designer.cs | 0 src/App/Resources/AppResources.pl.resx | 1349 -- .../Resources/AppResources.pt-BR.Designer.cs | 0 src/App/Resources/AppResources.pt-BR.resx | 1349 -- .../Resources/AppResources.pt-PT.Designer.cs | 0 src/App/Resources/AppResources.pt-PT.resx | 1349 -- src/App/Resources/AppResources.resx | 1349 -- src/App/Resources/AppResources.ro.Designer.cs | 0 src/App/Resources/AppResources.ro.resx | 1349 -- src/App/Resources/AppResources.ru.Designer.cs | 0 src/App/Resources/AppResources.ru.resx | 1349 -- src/App/Resources/AppResources.sk.Designer.cs | 0 src/App/Resources/AppResources.sk.resx | 1349 -- src/App/Resources/AppResources.sv.Designer.cs | 0 src/App/Resources/AppResources.sv.resx | 1349 -- src/App/Resources/AppResources.th.Designer.cs | 0 src/App/Resources/AppResources.th.resx | 1349 -- src/App/Resources/AppResources.tr.Designer.cs | 0 src/App/Resources/AppResources.tr.resx | 1349 -- src/App/Resources/AppResources.uk.Designer.cs | 0 src/App/Resources/AppResources.uk.resx | 1349 -- src/App/Resources/AppResources.vi.Designer.cs | 0 src/App/Resources/AppResources.vi.resx | 1349 -- .../AppResources.zh-Hans.Designer.cs | 0 src/App/Resources/AppResources.zh-Hans.resx | 1349 -- .../AppResources.zh-Hant.Designer.cs | 0 src/App/Resources/AppResources.zh-Hant.resx | 1349 -- src/App/Resources/public_suffix_list.dat | 12653 ---------------- src/App/Services/AppIdService.cs | 41 - src/App/Services/AppSettingsService.cs | 236 - src/App/Services/AuthService.cs | 390 - src/App/Services/CipherService.cs | 575 - src/App/Services/CollectionService.cs | 52 - src/App/Services/CryptoService.cs | 518 - src/App/Services/DatabaseService.cs | 27 - src/App/Services/FolderService.cs | 100 - src/App/Services/LockService.cs | 142 - .../Services/NoopGoogleAnalyticsService.cs | 40 - .../Services/NoopPushNotificationListener.cs | 29 - .../Services/NoopPushNotificationService.cs | 17 - src/App/Services/PasswordGenerationService.cs | 188 - src/App/Services/PushNotificationListener.cs | 206 - src/App/Services/SettingsService.cs | 36 - src/App/Services/SyncService.cs | 595 - src/App/Services/TokenService.cs | 214 - src/App/Utilities/ApiHttpClient.cs | 44 - src/App/Utilities/Base32.cs | 72 - src/App/Utilities/Colors.cs | 9 - src/App/Utilities/Crypto.cs | 246 - .../Utilities/ExtendedObservableCollection.cs | 33 - src/App/Utilities/Extentions.cs | 137 - src/App/Utilities/Helpers.cs | 647 - src/App/Utilities/IdentityHttpClient.cs | 44 - src/App/Utilities/PasswordFormatter.cs | 78 - src/App/Utilities/TokenHttpRequestMessage.cs | 39 - src/UWP.Images/UWP.Images.projitems | 62 - src/UWP.Images/UWP.Images.shproj | 13 - src/UWP.Images/android.png | Bin 1227 -> 0 bytes src/UWP.Images/apple.png | Bin 1224 -> 0 bytes src/UWP.Images/camera.png | Bin 664 -> 0 bytes src/UWP.Images/card.png | Bin 469 -> 0 bytes src/UWP.Images/clipboard.png | Bin 426 -> 0 bytes src/UWP.Images/cloudup.png | Bin 2013 -> 0 bytes src/UWP.Images/cog.png | Bin 1700 -> 0 bytes src/UWP.Images/cog_alt.png | Bin 738 -> 0 bytes src/UWP.Images/cogs.png | Bin 2143 -> 0 bytes src/UWP.Images/cogs_selected.png | Bin 2143 -> 0 bytes src/UWP.Images/download.png | Bin 690 -> 0 bytes src/UWP.Images/envelope.png | Bin 1053 -> 0 bytes src/UWP.Images/eye.png | Bin 833 -> 0 bytes src/UWP.Images/eye_slash.png | Bin 937 -> 0 bytes src/UWP.Images/fa_lock.png | Bin 1100 -> 0 bytes src/UWP.Images/fa_lock_selected.png | Bin 1100 -> 0 bytes src/UWP.Images/folder.png | Bin 1009 -> 0 bytes src/UWP.Images/globe.png | Bin 3540 -> 0 bytes src/UWP.Images/icon.png | Bin 4297 -> 0 bytes src/UWP.Images/id.png | Bin 807 -> 0 bytes src/UWP.Images/ion_chevron_left.png | Bin 1029 -> 0 bytes src/UWP.Images/ion_chevron_right.png | Bin 881 -> 0 bytes src/UWP.Images/launch.png | Bin 686 -> 0 bytes src/UWP.Images/lightbulb.png | Bin 1402 -> 0 bytes src/UWP.Images/lock.png | Bin 810 -> 0 bytes src/UWP.Images/login.png | Bin 1917 -> 0 bytes src/UWP.Images/logo.png | Bin 8426 -> 0 bytes src/UWP.Images/more.png | Bin 921 -> 0 bytes src/UWP.Images/more_selected.png | Bin 584 -> 0 bytes src/UWP.Images/note.png | Bin 524 -> 0 bytes src/UWP.Images/notification_sm.png | Bin 1038 -> 0 bytes src/UWP.Images/paperclip.png | Bin 1496 -> 0 bytes src/UWP.Images/photo.png | Bin 1194 -> 0 bytes src/UWP.Images/plus.png | Bin 150 -> 0 bytes src/UWP.Images/refresh.png | Bin 1771 -> 0 bytes src/UWP.Images/refresh_alt.png | Bin 1017 -> 0 bytes src/UWP.Images/refresh_selected.png | Bin 1771 -> 0 bytes src/UWP.Images/search.png | Bin 1293 -> 0 bytes src/UWP.Images/share.png | Bin 1047 -> 0 bytes src/UWP.Images/share_tools.png | Bin 2397 -> 0 bytes src/UWP.Images/smile.png | Bin 5468 -> 0 bytes src/UWP.Images/tools.png | Bin 1373 -> 0 bytes src/UWP.Images/tools_selected.png | Bin 1322 -> 0 bytes src/UWP.Images/trash.png | Bin 552 -> 0 bytes src/UWP.Images/upload.png | Bin 1421 -> 0 bytes src/UWP.Images/user.png | Bin 1183 -> 0 bytes src/UWP.Images/yubikey.png | Bin 390403 -> 0 bytes src/UWP/App.xaml | 14 - src/UWP/App.xaml.cs | 150 - src/UWP/Assets/BadgeLogo.scale-100.png | Bin 183 -> 0 bytes src/UWP/Assets/BadgeLogo.scale-125.png | Bin 209 -> 0 bytes src/UWP/Assets/BadgeLogo.scale-150.png | Bin 185 -> 0 bytes src/UWP/Assets/BadgeLogo.scale-200.png | Bin 298 -> 0 bytes src/UWP/Assets/BadgeLogo.scale-400.png | Bin 539 -> 0 bytes src/UWP/Assets/LargeTile.scale-100.png | Bin 4414 -> 0 bytes src/UWP/Assets/LargeTile.scale-125.png | Bin 5800 -> 0 bytes src/UWP/Assets/LargeTile.scale-150.png | Bin 7424 -> 0 bytes src/UWP/Assets/LargeTile.scale-200.png | Bin 10547 -> 0 bytes src/UWP/Assets/LargeTile.scale-400.png | Bin 30655 -> 0 bytes src/UWP/Assets/LockScreenLogo.scale-200.png | Bin 694 -> 0 bytes src/UWP/Assets/SmallTile.scale-100.png | Bin 1453 -> 0 bytes src/UWP/Assets/SmallTile.scale-125.png | Bin 1739 -> 0 bytes src/UWP/Assets/SmallTile.scale-150.png | Bin 2103 -> 0 bytes src/UWP/Assets/SmallTile.scale-200.png | Bin 2656 -> 0 bytes src/UWP/Assets/SmallTile.scale-400.png | Bin 5722 -> 0 bytes src/UWP/Assets/SplashScreen.scale-100.png | Bin 4800 -> 0 bytes src/UWP/Assets/SplashScreen.scale-125.png | Bin 6209 -> 0 bytes src/UWP/Assets/SplashScreen.scale-150.png | Bin 7990 -> 0 bytes src/UWP/Assets/SplashScreen.scale-200.png | Bin 11641 -> 0 bytes src/UWP/Assets/SplashScreen.scale-400.png | Bin 36109 -> 0 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 2171 -> 0 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 2688 -> 0 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 3152 -> 0 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 9506 -> 0 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 10033 -> 0 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 652 -> 0 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 10684 -> 0 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 1117 -> 0 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 1605 -> 0 bytes src/UWP/Assets/Square44x44Logo.scale-100.png | Bin 1197 -> 0 bytes src/UWP/Assets/Square44x44Logo.scale-125.png | Bin 1435 -> 0 bytes src/UWP/Assets/Square44x44Logo.scale-150.png | Bin 1778 -> 0 bytes src/UWP/Assets/Square44x44Logo.scale-200.png | Bin 2307 -> 0 bytes src/UWP/Assets/Square44x44Logo.scale-400.png | Bin 4560 -> 0 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 538 -> 0 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 742 -> 0 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 919 -> 0 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 5679 -> 0 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 971 -> 0 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 1303 -> 0 bytes src/UWP/Assets/StoreLogo.backup.png | Bin 621 -> 0 bytes src/UWP/Assets/StoreLogo.scale-100.png | Bin 1685 -> 0 bytes src/UWP/Assets/StoreLogo.scale-125.png | Bin 2120 -> 0 bytes src/UWP/Assets/StoreLogo.scale-150.png | Bin 2433 -> 0 bytes src/UWP/Assets/StoreLogo.scale-200.png | Bin 3175 -> 0 bytes src/UWP/Assets/StoreLogo.scale-400.png | Bin 7299 -> 0 bytes src/UWP/Assets/Wide310x150Logo.scale-100.png | Bin 2375 -> 0 bytes src/UWP/Assets/Wide310x150Logo.scale-125.png | Bin 2928 -> 0 bytes src/UWP/Assets/Wide310x150Logo.scale-150.png | Bin 3488 -> 0 bytes src/UWP/Assets/Wide310x150Logo.scale-200.png | Bin 4800 -> 0 bytes src/UWP/Assets/Wide310x150Logo.scale-400.png | Bin 11641 -> 0 bytes src/UWP/Controls/ExtendedTableViewRenderer.cs | 28 - src/UWP/IconConverter.cs | 23 - src/UWP/MainPage.xaml | 14 - src/UWP/MainPage.xaml.cs | 29 - src/UWP/Package.appxmanifest | 34 - src/UWP/Properties/AssemblyInfo.cs | 29 - src/UWP/Properties/Default.rd.xml | 31 - src/UWP/Services/AppInfoService.cs | 22 - src/UWP/Services/DeviceActionService.cs | 203 - src/UWP/Services/DeviceInfoService.cs | 47 - src/UWP/Services/GoogleAnalyticsService.cs | 36 - src/UWP/Services/HttpService.cs | 11 - src/UWP/Services/KeyDerivationService.cs | 24 - src/UWP/Services/LocalizeService.cs | 25 - src/UWP/Services/LogService.cs | 10 - src/UWP/Services/SecureStorageService.cs | 59 - src/UWP/Services/SqlService.cs | 22 - .../Services/UwpPushNotificationService.cs | 81 - src/UWP/Styles.xaml | 22 - src/UWP/UWP.csproj | 223 - src/iOS.Autofill/AppDelegate.cs | 46 - .../CredentialProviderViewController.cs | 372 - ...edentialProviderViewController.designer.cs | 21 - src/iOS.Autofill/Entitlements.plist | 16 - src/iOS.Autofill/Info.plist | 87 - .../LockFingerprintViewController.cs | 28 - .../LockFingerprintViewController.designer.cs | 64 - .../LockPasswordViewController.cs | 27 - .../LockPasswordViewController.designer.cs | 64 - src/iOS.Autofill/LockPinViewController.cs | 24 - .../LockPinViewController.designer.cs | 69 - src/iOS.Autofill/LoginAddViewController.cs | 50 - .../LoginAddViewController.designer.cs | 55 - src/iOS.Autofill/LoginListViewController.cs | 102 - .../LoginListViewController.designer.cs | 59 - src/iOS.Autofill/LoginSearchViewController.cs | 93 - .../LoginSearchViewController.designer.cs | 55 - src/iOS.Autofill/Main.cs | 15 - src/iOS.Autofill/MainInterface.storyboard | 696 - src/iOS.Autofill/Models/Context.cs | 14 - .../PasswordGeneratorViewController.cs | 31 - ...asswordGeneratorViewController.designer.cs | 82 - src/iOS.Autofill/Properties/AssemblyInfo.cs | 35 - src/iOS.Autofill/Resources/Icon.png | Bin 595 -> 0 bytes src/iOS.Autofill/Resources/Icon@2x.png | Bin 861 -> 0 bytes src/iOS.Autofill/Resources/Icon@3x.png | Bin 1217 -> 0 bytes src/iOS.Autofill/Resources/check.png | Bin 746 -> 0 bytes src/iOS.Autofill/Resources/check@2x.png | Bin 1233 -> 0 bytes src/iOS.Autofill/Resources/check@3x.png | Bin 1820 -> 0 bytes src/iOS.Autofill/Resources/fingerprint.png | Bin 3956 -> 0 bytes src/iOS.Autofill/Resources/fingerprint@2x.png | Bin 8554 -> 0 bytes src/iOS.Autofill/Resources/fingerprint@3x.png | Bin 13475 -> 0 bytes src/iOS.Autofill/Resources/logo.png | Bin 2593 -> 0 bytes src/iOS.Autofill/Resources/logo@2x.png | Bin 5449 -> 0 bytes src/iOS.Autofill/Resources/logo@3x.png | Bin 8426 -> 0 bytes src/iOS.Autofill/Resources/smile.png | Bin 2017 -> 0 bytes src/iOS.Autofill/Resources/smile@2x.png | Bin 3682 -> 0 bytes src/iOS.Autofill/Resources/smile@3x.png | Bin 5468 -> 0 bytes src/iOS.Autofill/SetupViewController.cs | 49 - .../SetupViewController.designer.cs | 69 - src/iOS.Autofill/Utilities/AutofillHelpers.cs | 106 - src/iOS.Autofill/iOS.Autofill.csproj | 302 - src/iOS.Core/Constants.cs | 32 - .../ExtendedUITableViewController.cs | 21 - .../Controllers/ExtendedUIViewController.cs | 21 - .../LockFingerprintViewController.cs | 86 - .../Controllers/LockPasswordViewController.cs | 178 - .../Controllers/LockPinViewController.cs | 102 - .../Controllers/LoginAddViewController.cs | 338 - .../PasswordGeneratorViewController.cs | 360 - src/iOS.Core/HockeyAppCrashManagerDelegate.cs | 31 - src/iOS.Core/Models/AppExtensionContext.cs | 52 - src/iOS.Core/Models/CipherViewModel.cs | 57 - .../Models/PasswordGenerationOptions.cs | 13 - src/iOS.Core/Properties/AssemblyInfo.cs | 36 - src/iOS.Core/Services/AppInfoService.cs | 14 - .../CommonCryptoKeyDerivationService.cs | 34 - src/iOS.Core/Services/DeviceInfoService.cs | 59 - .../Services/GoogleAnalyticsService.cs | 47 - src/iOS.Core/Services/HttpService.cs | 12 - .../Services/KeyChainStorageService.cs | 92 - src/iOS.Core/Services/LocalizeService.cs | 111 - src/iOS.Core/Services/LogService.cs | 13 - .../Services/NoopDeviceActionService.cs | 101 - src/iOS.Core/Services/Settings.cs | 495 - src/iOS.Core/Services/SqlService.cs | 32 - src/iOS.Core/Utilities/ASHelpers.cs | 72 - src/iOS.Core/Utilities/Dialogs.cs | 55 - src/iOS.Core/Views/ExtensionSearchDelegate.cs | 49 - src/iOS.Core/Views/ExtensionTableSource.cs | 149 - src/iOS.Core/Views/FormEntryTableViewCell.cs | 129 - src/iOS.Core/Views/ISelectable.cs | 7 - src/iOS.Core/Views/PickerTableViewCell.cs | 195 - src/iOS.Core/Views/SliderTableViewCell.cs | 56 - src/iOS.Core/Views/StepperTableViewCell.cs | 51 - src/iOS.Core/Views/SwitchTableViewCell.cs | 25 - src/iOS.Core/Views/Toast.cs | 143 - src/iOS.Core/iOS.Core.csproj | 86 - src/iOS.Extension/AppDelegate.cs | 46 - src/iOS.Extension/Entitlements.plist | 14 - src/iOS.Extension/Info.plist | 104 - src/iOS.Extension/LoadingViewController.cs | 530 - .../LoadingViewController.designer.cs | 21 - .../LockFingerprintViewController.cs | 28 - .../LockFingerprintViewController.designer.cs | 64 - .../LockPasswordViewController.cs | 27 - .../LockPasswordViewController.designer.cs | 64 - src/iOS.Extension/LockPinViewController.cs | 24 - .../LockPinViewController.designer.cs | 69 - src/iOS.Extension/LoginAddViewController.cs | 64 - .../LoginAddViewController.designer.cs | 55 - src/iOS.Extension/LoginListViewController.cs | 197 - .../LoginListViewController.designer.cs | 55 - src/iOS.Extension/Main.cs | 15 - src/iOS.Extension/MainInterface.storyboard | 615 - src/iOS.Extension/Models/Context.cs | 19 - src/iOS.Extension/Models/FillScript.cs | 276 - src/iOS.Extension/Models/PageDetails.cs | 52 - .../PasswordGeneratorViewController.cs | 31 - ...asswordGeneratorViewController.designer.cs | 82 - src/iOS.Extension/Properties/AssemblyInfo.cs | 35 - src/iOS.Extension/Resources/Icon.png | Bin 595 -> 0 bytes src/iOS.Extension/Resources/Icon@2x.png | Bin 861 -> 0 bytes src/iOS.Extension/Resources/Icon@3x.png | Bin 1217 -> 0 bytes src/iOS.Extension/Resources/ext-icon.png | Bin 1263 -> 0 bytes src/iOS.Extension/Resources/ext-icon@2x.png | Bin 2532 -> 0 bytes src/iOS.Extension/Resources/ext-icon@3x.png | Bin 3838 -> 0 bytes src/iOS.Extension/Resources/fingerprint.png | Bin 3956 -> 0 bytes .../Resources/fingerprint@2x.png | Bin 8554 -> 0 bytes .../Resources/fingerprint@3x.png | Bin 13475 -> 0 bytes src/iOS.Extension/Resources/logo.png | Bin 2593 -> 0 bytes src/iOS.Extension/Resources/logo@2x.png | Bin 5449 -> 0 bytes src/iOS.Extension/Resources/logo@3x.png | Bin 8426 -> 0 bytes src/iOS.Extension/Resources/smile.png | Bin 2017 -> 0 bytes src/iOS.Extension/Resources/smile@2x.png | Bin 3682 -> 0 bytes src/iOS.Extension/Resources/smile@3x.png | Bin 5468 -> 0 bytes src/iOS.Extension/SetupViewController.cs | 47 - .../SetupViewController.designer.cs | 69 - src/iOS.Extension/extension.js | 101 - src/iOS.Extension/iOS.Extension.csproj | 292 - src/iOS/AppDelegate.cs | 409 - src/iOS/Controls/ContentPageRenderer.cs | 68 - src/iOS/Controls/CustomButtonRenderer.cs | 60 - src/iOS/Controls/CustomLabelRenderer.cs | 72 - src/iOS/Controls/CustomSearchBarRenderer.cs | 33 - src/iOS/Controls/ExtendedButtonRenderer.cs | 56 - src/iOS/Controls/ExtendedEditorRenderer.cs | 26 - src/iOS/Controls/ExtendedEntryRenderer.cs | 190 - src/iOS/Controls/ExtendedListViewRenderer.cs | 44 - src/iOS/Controls/ExtendedPickerRenderer.cs | 45 - .../Controls/ExtendedSwitchCellRenderer.cs | 25 - .../Controls/ExtendedTabbedPageRenderer.cs | 79 - src/iOS/Controls/ExtendedTableViewRenderer.cs | 181 - src/iOS/Controls/ExtendedTextCellRenderer.cs | 90 - src/iOS/Controls/ExtendedViewCellRenderer.cs | 31 - src/iOS/Controls/HybridWebViewRenderer.cs | 54 - src/iOS/Entitlements.plist | 28 - src/iOS/Info.plist | 115 - src/iOS/LaunchScreen.storyboard | 92 - src/iOS/Main.cs | 22 - src/iOS/NFCReaderDelegate.cs | 54 - src/iOS/Properties/AssemblyInfo.cs | 35 - .../AppIcons.appiconset/Contents.json | 117 - .../AppIcons.appiconset/Icon-1024.png | Bin 16621 -> 0 bytes .../AppIcons.appiconset/Icon-120.png | Bin 5046 -> 0 bytes .../AppIcons.appiconset/Icon-152.png | Bin 8793 -> 0 bytes .../AppIcons.appiconset/Icon-167.png | Bin 3166 -> 0 bytes .../AppIcons.appiconset/Icon-180.png | Bin 15716 -> 0 bytes .../AppIcons.appiconset/Icon-20.png | Bin 800 -> 0 bytes .../AppIcons.appiconset/Icon-29.png | Bin 863 -> 0 bytes .../AppIcons.appiconset/Icon-40.png | Bin 1062 -> 0 bytes .../AppIcons.appiconset/Icon-58.png | Bin 2267 -> 0 bytes .../AppIcons.appiconset/Icon-60.png | Bin 1948 -> 0 bytes .../AppIcons.appiconset/Icon-76.png | Bin 3173 -> 0 bytes .../AppIcons.appiconset/Icon-80.png | Bin 2072 -> 0 bytes .../AppIcons.appiconset/Icon-87.png | Bin 4358 -> 0 bytes src/iOS/Resources/android.png | Bin 406 -> 0 bytes src/iOS/Resources/android@2x.png | Bin 659 -> 0 bytes src/iOS/Resources/android@3x.png | Bin 994 -> 0 bytes src/iOS/Resources/apple.png | Bin 446 -> 0 bytes src/iOS/Resources/apple@2x.png | Bin 741 -> 0 bytes src/iOS/Resources/apple@3x.png | Bin 1005 -> 0 bytes src/iOS/Resources/autofill-kb.png | Bin 28497 -> 0 bytes src/iOS/Resources/autofill-kb@2x.png | Bin 84830 -> 0 bytes src/iOS/Resources/autofill-kb@3x.png | Bin 139491 -> 0 bytes src/iOS/Resources/camera.png | Bin 478 -> 0 bytes src/iOS/Resources/camera@2x.png | Bin 802 -> 0 bytes src/iOS/Resources/camera@3x.png | Bin 1208 -> 0 bytes src/iOS/Resources/card.png | Bin 229 -> 0 bytes src/iOS/Resources/card@2x.png | Bin 326 -> 0 bytes src/iOS/Resources/card@3x.png | Bin 234 -> 0 bytes src/iOS/Resources/clipboard.png | Bin 350 -> 0 bytes src/iOS/Resources/clipboard@2x.png | Bin 487 -> 0 bytes src/iOS/Resources/clipboard@3x.png | Bin 677 -> 0 bytes src/iOS/Resources/cloudup.png | Bin 779 -> 0 bytes src/iOS/Resources/cloudup@2x.png | Bin 1273 -> 0 bytes src/iOS/Resources/cloudup@3x.png | Bin 1703 -> 0 bytes src/iOS/Resources/cog.png | Bin 610 -> 0 bytes src/iOS/Resources/cog@2x.png | Bin 1058 -> 0 bytes src/iOS/Resources/cog@3x.png | Bin 1415 -> 0 bytes src/iOS/Resources/cog_alt.png | Bin 590 -> 0 bytes src/iOS/Resources/cog_alt@2x.png | Bin 1005 -> 0 bytes src/iOS/Resources/cog_alt@3x.png | Bin 1239 -> 0 bytes src/iOS/Resources/cogs.png | Bin 878 -> 0 bytes src/iOS/Resources/cogs@2x.png | Bin 1524 -> 0 bytes src/iOS/Resources/cogs@3x.png | Bin 2088 -> 0 bytes src/iOS/Resources/cube.png | Bin 533 -> 0 bytes src/iOS/Resources/cube@2x.png | Bin 941 -> 0 bytes src/iOS/Resources/cube@3x.png | Bin 1206 -> 0 bytes src/iOS/Resources/download.png | Bin 378 -> 0 bytes src/iOS/Resources/download@2x.png | Bin 556 -> 0 bytes src/iOS/Resources/download@3x.png | Bin 707 -> 0 bytes src/iOS/Resources/envelope.png | Bin 374 -> 0 bytes src/iOS/Resources/envelope@2x.png | Bin 629 -> 0 bytes src/iOS/Resources/envelope@3x.png | Bin 884 -> 0 bytes src/iOS/Resources/ext-act.png | Bin 16254 -> 0 bytes src/iOS/Resources/ext-act@2x.png | Bin 45613 -> 0 bytes src/iOS/Resources/ext-act@3x.png | Bin 72971 -> 0 bytes src/iOS/Resources/ext-more.png | Bin 16228 -> 0 bytes src/iOS/Resources/ext-more@2x.png | Bin 45327 -> 0 bytes src/iOS/Resources/ext-more@3x.png | Bin 71822 -> 0 bytes src/iOS/Resources/ext-use.png | Bin 17523 -> 0 bytes src/iOS/Resources/ext-use@2x.png | Bin 47770 -> 0 bytes src/iOS/Resources/ext-use@3x.png | Bin 74989 -> 0 bytes src/iOS/Resources/eye.png | Bin 607 -> 0 bytes src/iOS/Resources/eye@2x.png | Bin 1056 -> 0 bytes src/iOS/Resources/eye@3x.png | Bin 1448 -> 0 bytes src/iOS/Resources/eye_slash.png | Bin 659 -> 0 bytes src/iOS/Resources/eye_slash@2x.png | Bin 1204 -> 0 bytes src/iOS/Resources/eye_slash@3x.png | Bin 1608 -> 0 bytes src/iOS/Resources/fa_lock.png | Bin 437 -> 0 bytes src/iOS/Resources/fa_lock@2x.png | Bin 663 -> 0 bytes src/iOS/Resources/fa_lock@3x.png | Bin 877 -> 0 bytes src/iOS/Resources/fingerprint.png | Bin 3956 -> 0 bytes src/iOS/Resources/fingerprint@2x.png | Bin 8554 -> 0 bytes src/iOS/Resources/fingerprint@3x.png | Bin 13475 -> 0 bytes src/iOS/Resources/folder.png | Bin 388 -> 0 bytes src/iOS/Resources/folder@2x.png | Bin 598 -> 0 bytes src/iOS/Resources/folder@3x.png | Bin 810 -> 0 bytes src/iOS/Resources/folder_o.png | Bin 401 -> 0 bytes src/iOS/Resources/folder_o@2x.png | Bin 686 -> 0 bytes src/iOS/Resources/folder_o@3x.png | Bin 816 -> 0 bytes src/iOS/Resources/globe.png | Bin 1255 -> 0 bytes src/iOS/Resources/globe@2x.png | Bin 2051 -> 0 bytes src/iOS/Resources/globe@3x.png | Bin 2803 -> 0 bytes src/iOS/Resources/id.png | Bin 342 -> 0 bytes src/iOS/Resources/id@2x.png | Bin 545 -> 0 bytes src/iOS/Resources/id@3x.png | Bin 868 -> 0 bytes src/iOS/Resources/launch.png | Bin 596 -> 0 bytes src/iOS/Resources/launch@2x.png | Bin 910 -> 0 bytes src/iOS/Resources/launch@3x.png | Bin 1207 -> 0 bytes src/iOS/Resources/lightbulb.png | Bin 468 -> 0 bytes src/iOS/Resources/lightbulb@2x.png | Bin 789 -> 0 bytes src/iOS/Resources/lightbulb@3x.png | Bin 1164 -> 0 bytes src/iOS/Resources/lock.png | Bin 359 -> 0 bytes src/iOS/Resources/lock@2x.png | Bin 569 -> 0 bytes src/iOS/Resources/lock@3x.png | Bin 733 -> 0 bytes src/iOS/Resources/login.png | Bin 657 -> 0 bytes src/iOS/Resources/login@2x.png | Bin 1172 -> 0 bytes src/iOS/Resources/login@3x.png | Bin 1588 -> 0 bytes src/iOS/Resources/logo.png | Bin 2593 -> 0 bytes src/iOS/Resources/logo@2x.png | Bin 5449 -> 0 bytes src/iOS/Resources/logo@3x.png | Bin 8426 -> 0 bytes src/iOS/Resources/magic.png | Bin 778 -> 0 bytes src/iOS/Resources/magic@2x.png | Bin 1235 -> 0 bytes src/iOS/Resources/magic@3x.png | Bin 1748 -> 0 bytes src/iOS/Resources/more.png | Bin 271 -> 0 bytes src/iOS/Resources/more@2x.png | Bin 479 -> 0 bytes src/iOS/Resources/more@3x.png | Bin 584 -> 0 bytes src/iOS/Resources/more_selected.png | Bin 271 -> 0 bytes src/iOS/Resources/more_selected@2x.png | Bin 479 -> 0 bytes src/iOS/Resources/more_selected@3x.png | Bin 584 -> 0 bytes src/iOS/Resources/note.png | Bin 272 -> 0 bytes src/iOS/Resources/note@2x.png | Bin 382 -> 0 bytes src/iOS/Resources/note@3x.png | Bin 359 -> 0 bytes src/iOS/Resources/paperclip.png | Bin 249 -> 0 bytes src/iOS/Resources/paperclip@2x.png | Bin 802 -> 0 bytes src/iOS/Resources/paperclip@3x.png | Bin 1151 -> 0 bytes src/iOS/Resources/photo.png | Bin 434 -> 0 bytes src/iOS/Resources/photo@2x.png | Bin 685 -> 0 bytes src/iOS/Resources/photo@3x.png | Bin 1194 -> 0 bytes src/iOS/Resources/plus.png | Bin 155 -> 0 bytes src/iOS/Resources/plus@2x.png | Bin 133 -> 0 bytes src/iOS/Resources/plus@3x.png | Bin 140 -> 0 bytes src/iOS/Resources/refresh.png | Bin 686 -> 0 bytes src/iOS/Resources/refresh@2x.png | Bin 1131 -> 0 bytes src/iOS/Resources/refresh@3x.png | Bin 1517 -> 0 bytes src/iOS/Resources/refresh_alt.png | Bin 583 -> 0 bytes src/iOS/Resources/refresh_alt@2x.png | Bin 1017 -> 0 bytes src/iOS/Resources/refresh_alt@3x.png | Bin 1320 -> 0 bytes src/iOS/Resources/search.png | Bin 449 -> 0 bytes src/iOS/Resources/search@2x.png | Bin 693 -> 0 bytes src/iOS/Resources/search@3x.png | Bin 957 -> 0 bytes src/iOS/Resources/share.png | Bin 298 -> 0 bytes src/iOS/Resources/share@2x.png | Bin 503 -> 0 bytes src/iOS/Resources/share@3x.png | Bin 649 -> 0 bytes src/iOS/Resources/share_tools.png | Bin 817 -> 0 bytes src/iOS/Resources/share_tools@2x.png | Bin 1302 -> 0 bytes src/iOS/Resources/share_tools@3x.png | Bin 1495 -> 0 bytes src/iOS/Resources/smile.png | Bin 2017 -> 0 bytes src/iOS/Resources/smile@2x.png | Bin 3682 -> 0 bytes src/iOS/Resources/smile@3x.png | Bin 5468 -> 0 bytes src/iOS/Resources/tools.png | Bin 493 -> 0 bytes src/iOS/Resources/tools@2x.png | Bin 839 -> 0 bytes src/iOS/Resources/tools@3x.png | Bin 1134 -> 0 bytes src/iOS/Resources/trash.png | Bin 274 -> 0 bytes src/iOS/Resources/trash@2x.png | Bin 390 -> 0 bytes src/iOS/Resources/trash@3x.png | Bin 534 -> 0 bytes src/iOS/Resources/upload.png | Bin 533 -> 0 bytes src/iOS/Resources/upload@2x.png | Bin 969 -> 0 bytes src/iOS/Resources/upload@3x.png | Bin 1195 -> 0 bytes src/iOS/Resources/user.png | Bin 425 -> 0 bytes src/iOS/Resources/user@2x.png | Bin 685 -> 0 bytes src/iOS/Resources/user@3x.png | Bin 895 -> 0 bytes src/iOS/Resources/yubikey.png | Bin 54828 -> 0 bytes src/iOS/Resources/yubikey@2x.png | Bin 204568 -> 0 bytes src/iOS/Resources/yubikey@3x.png | Bin 427125 -> 0 bytes src/iOS/Services/DeviceActionService.cs | 412 - .../Services/iOSPushNotificationHandler.cs | 71 - .../Services/iOSPushNotificationService.cs | 38 - src/iOS/iOS.csproj | 754 - store/apple/bg/copy.resx | 155 - store/apple/cs/copy.resx | 153 - store/apple/da/copy.resx | 155 - store/apple/de/copy.resx | 153 - store/apple/en-GB/copy.resx | 155 - store/apple/en/copy.resx | 155 - .../3.5-inch (iPhone 4) - Screenshot 1.png | Bin 242771 -> 0 bytes .../3.5-inch (iPhone 4) - Screenshot 2.png | Bin 267708 -> 0 bytes .../3.5-inch (iPhone 4) - Screenshot 3.png | Bin 234095 -> 0 bytes .../3.5-inch (iPhone 4) - Screenshot 4.png | Bin 286968 -> 0 bytes .../3.5-inch (iPhone 4) - Screenshot 5.png | Bin 188156 -> 0 bytes .../4-inch (iPhone 5) - Screenshot 1.png | Bin 222764 -> 0 bytes .../4-inch (iPhone 5) - Screenshot 2.png | Bin 248748 -> 0 bytes .../4-inch (iPhone 5) - Screenshot 3.png | Bin 214312 -> 0 bytes .../4-inch (iPhone 5) - Screenshot 4.png | Bin 284340 -> 0 bytes .../4-inch (iPhone 5) - Screenshot 5.png | Bin 202391 -> 0 bytes .../4.7-inch (iPhone 6) - Screenshot 1.png | Bin 301565 -> 0 bytes .../4.7-inch (iPhone 6) - Screenshot 2.png | Bin 333603 -> 0 bytes .../4.7-inch (iPhone 6) - Screenshot 3.png | Bin 294874 -> 0 bytes .../4.7-inch (iPhone 6) - Screenshot 4.png | Bin 378161 -> 0 bytes .../4.7-inch (iPhone 6) - Screenshot 5.png | Bin 245848 -> 0 bytes .../5.5-inch (iPhone 6+) - Screenshot 1.png | Bin 607037 -> 0 bytes .../5.5-inch (iPhone 6+) - Screenshot 2.png | Bin 677854 -> 0 bytes .../5.5-inch (iPhone 6+) - Screenshot 3.png | Bin 600358 -> 0 bytes .../5.5-inch (iPhone 6+) - Screenshot 4.png | Bin 762565 -> 0 bytes .../5.5-inch (iPhone 6+) - Screenshot 5.png | Bin 514217 -> 0 bytes .../en/screenshots/iPad - Screenshot 1.png | Bin 642325 -> 0 bytes .../en/screenshots/iPad - Screenshot 2.png | Bin 508892 -> 0 bytes .../en/screenshots/iPad - Screenshot 3.png | Bin 491689 -> 0 bytes .../en/screenshots/iPad - Screenshot 4.png | Bin 716848 -> 0 bytes .../en/screenshots/iPad - Screenshot 5.png | Bin 466072 -> 0 bytes .../screenshots/iPad Pro - Screenshot 1.png | Bin 932304 -> 0 bytes .../screenshots/iPad Pro - Screenshot 2.png | Bin 745766 -> 0 bytes .../screenshots/iPad Pro - Screenshot 3.png | Bin 692031 -> 0 bytes .../screenshots/iPad Pro - Screenshot 4.png | Bin 1046432 -> 0 bytes .../screenshots/iPad Pro - Screenshot 5.png | Bin 719445 -> 0 bytes store/apple/es/copy.resx | 156 - store/apple/et/copy.resx | 155 - store/apple/fa/copy.resx | 158 - store/apple/fi/copy.resx | 153 - store/apple/fr/copy.resx | 153 - store/apple/hi/copy.resx | 153 - store/apple/hr/copy.resx | 153 - store/apple/hu/copy.resx | 153 - store/apple/id/copy.resx | 155 - store/apple/it/copy.resx | 153 - store/apple/ja/copy.resx | 155 - store/apple/ko/copy.resx | 153 - store/apple/nb/copy.resx | 153 - store/apple/nl/copy.resx | 153 - store/apple/pl/copy.resx | 153 - store/apple/pt-BR/copy.resx | 153 - store/apple/pt-PT/copy.resx | 155 - store/apple/ro/copy.resx | 153 - store/apple/ru/copy.resx | 155 - store/apple/sk/copy.resx | 153 - store/apple/sv/copy.resx | 153 - store/apple/th/copy.resx | 153 - store/apple/tr/copy.resx | 153 - store/apple/uk/copy.resx | 155 - store/apple/vi/copy.resx | 153 - store/apple/zh-Hans/copy.resx | 153 - store/apple/zh-Hant/copy.resx | 155 - store/google/Publisher/Program.cs | 117 - store/google/Publisher/Publisher.csproj | 13 - store/google/Publisher/play_creds.json.enc | Bin 2384 -> 0 bytes store/google/bg/copy.resx | 163 - store/google/cs/copy.resx | 161 - store/google/da/copy.resx | 163 - store/google/de/copy.resx | 161 - store/google/en-GB/copy.resx | 163 - store/google/en/assets/feature-graphic.png | Bin 84560 -> 0 bytes store/google/en/copy.resx | 163 - .../screenshots/Nexus 6P - Screenshot 1.png | Bin 459110 -> 0 bytes .../screenshots/Nexus 6P - Screenshot 2.png | Bin 498313 -> 0 bytes .../screenshots/Nexus 6P - Screenshot 3.png | Bin 430952 -> 0 bytes .../screenshots/Nexus 6P - Screenshot 4.png | Bin 727240 -> 0 bytes .../screenshots/Nexus 6P - Screenshot 5.png | Bin 514194 -> 0 bytes .../en/screenshots/Nexus 7 - Screenshot 1.png | Bin 315423 -> 0 bytes .../en/screenshots/Nexus 7 - Screenshot 2.png | Bin 335247 -> 0 bytes .../en/screenshots/Nexus 7 - Screenshot 3.png | Bin 253442 -> 0 bytes .../en/screenshots/Nexus 7 - Screenshot 4.png | Bin 370640 -> 0 bytes .../en/screenshots/Nexus 7 - Screenshot 5.png | Bin 388216 -> 0 bytes store/google/es/copy.resx | 164 - store/google/et/copy.resx | 163 - store/google/fa/copy.resx | 166 - store/google/fi/copy.resx | 161 - store/google/fr/copy.resx | 161 - store/google/hi/copy.resx | 161 - store/google/hr/copy.resx | 161 - store/google/hu/copy.resx | 161 - store/google/icons/hi-res-icon.png | Bin 9565 -> 0 bytes store/google/id/copy.resx | 163 - store/google/it/copy.resx | 161 - store/google/ja/copy.resx | 163 - store/google/ko/copy.resx | 161 - store/google/nb/copy.resx | 161 - store/google/nl/copy.resx | 161 - store/google/pl/copy.resx | 163 - store/google/pt-BR/copy.resx | 161 - store/google/pt-PT/copy.resx | 163 - store/google/pt/copy.resx | 161 - store/google/ro/copy.resx | 161 - store/google/ru/copy.resx | 163 - store/google/sk/copy.resx | 161 - store/google/sv/copy.resx | 163 - store/google/th/copy.resx | 156 - store/google/tr/copy.resx | 161 - store/google/uk/copy.resx | 163 - store/google/vi/copy.resx | 161 - store/google/zh-Hans/copy.resx | 161 - store/google/zh-Hant/copy.resx | 161 - test/App.Test/App.Test.csproj | 100 - test/App.Test/CryptoServiceTests.cs | 40 - .../App.Test/PasswordGeneratorServiceTests.cs | 177 - test/App.Test/Properties/AssemblyInfo.cs | 36 - test/App.Test/app.config | 6 - 1180 files changed, 126197 deletions(-) delete mode 100644 appveyor.yml delete mode 100644 bitwarden-mobile.sln delete mode 100644 src/Android/8bit.keystore.enc delete mode 100644 src/Android/Android.csproj delete mode 100644 src/Android/Assets/AboutAssets.txt delete mode 100644 src/Android/Autofill/AutofillHelpers.cs delete mode 100644 src/Android/Autofill/AutofillService.cs delete mode 100644 src/Android/Autofill/Field.cs delete mode 100644 src/Android/Autofill/FieldCollection.cs delete mode 100644 src/Android/Autofill/FilledItem.cs delete mode 100644 src/Android/Autofill/Parser.cs delete mode 100644 src/Android/Autofill/SavedItem.cs delete mode 100644 src/Android/AutofillActivity.cs delete mode 100644 src/Android/AutofillCredentials.cs delete mode 100644 src/Android/AutofillService.cs delete mode 100644 src/Android/Controls/CustomButtonRenderer.cs delete mode 100644 src/Android/Controls/CustomLabelRenderer.cs delete mode 100644 src/Android/Controls/CustomSearchBarRenderer.cs delete mode 100644 src/Android/Controls/CustomSliderRenderer.cs delete mode 100644 src/Android/Controls/ExtendedButtonRenderer.cs delete mode 100644 src/Android/Controls/ExtendedEditorRenderer.cs delete mode 100644 src/Android/Controls/ExtendedEntryRenderer.cs delete mode 100644 src/Android/Controls/ExtendedListViewRenderer.cs delete mode 100644 src/Android/Controls/ExtendedPickerRenderer.cs delete mode 100644 src/Android/Controls/ExtendedSwitchCellRenderer.cs delete mode 100644 src/Android/Controls/ExtendedTabbedPageRenderer.cs delete mode 100644 src/Android/Controls/ExtendedTableViewRenderer.cs delete mode 100644 src/Android/Controls/ExtendedTextCellRenderer.cs delete mode 100644 src/Android/Controls/ExtendedViewCellRenderer.cs delete mode 100644 src/Android/Controls/HybridWebViewRenderer.cs delete mode 100644 src/Android/FirebaseInstanceIdService.cs delete mode 100644 src/Android/FirebaseMessagingService.cs delete mode 100644 src/Android/HockeyAppCrashManagerListener.cs delete mode 100644 src/Android/MainActivity.cs delete mode 100644 src/Android/MainApplication.cs delete mode 100644 src/Android/MyVaultTileService.cs delete mode 100644 src/Android/Naxam.Ittianyu.BottomNavExtension.dll delete mode 100644 src/Android/PackageReplacedReceiver.cs delete mode 100644 src/Android/Properties/AndroidManifest.xml delete mode 100644 src/Android/Properties/AssemblyInfo.cs delete mode 100644 src/Android/Resources/AboutResources.txt delete mode 100644 src/Android/Resources/Resource.Designer.cs delete mode 100644 src/Android/Resources/drawable-hdpi/accessibility_notification.png delete mode 100644 src/Android/Resources/drawable-hdpi/accessibility_notification_icon.png delete mode 100644 src/Android/Resources/drawable-hdpi/accessibility_step1.png delete mode 100644 src/Android/Resources/drawable-hdpi/accessibility_step2.png delete mode 100644 src/Android/Resources/drawable-hdpi/android.png delete mode 100644 src/Android/Resources/drawable-hdpi/apple.png delete mode 100644 src/Android/Resources/drawable-hdpi/autofill_enable.png delete mode 100644 src/Android/Resources/drawable-hdpi/autofill_use.png delete mode 100644 src/Android/Resources/drawable-hdpi/camera.png delete mode 100644 src/Android/Resources/drawable-hdpi/card.png delete mode 100644 src/Android/Resources/drawable-hdpi/clipboard.png delete mode 100644 src/Android/Resources/drawable-hdpi/cloudup.png delete mode 100644 src/Android/Resources/drawable-hdpi/cog.png delete mode 100644 src/Android/Resources/drawable-hdpi/cog_alt.png delete mode 100644 src/Android/Resources/drawable-hdpi/cogs.png delete mode 100644 src/Android/Resources/drawable-hdpi/cube.png delete mode 100644 src/Android/Resources/drawable-hdpi/download.png delete mode 100644 src/Android/Resources/drawable-hdpi/envelope.png delete mode 100644 src/Android/Resources/drawable-hdpi/eye.png delete mode 100644 src/Android/Resources/drawable-hdpi/eye_slash.png delete mode 100644 src/Android/Resources/drawable-hdpi/fa_lock.png delete mode 100644 src/Android/Resources/drawable-hdpi/fingerprint.png delete mode 100644 src/Android/Resources/drawable-hdpi/folder.png delete mode 100644 src/Android/Resources/drawable-hdpi/folder_o.png delete mode 100644 src/Android/Resources/drawable-hdpi/globe.png delete mode 100644 src/Android/Resources/drawable-hdpi/icon.png delete mode 100644 src/Android/Resources/drawable-hdpi/id.png delete mode 100644 src/Android/Resources/drawable-hdpi/ion_chevron_right.png delete mode 100644 src/Android/Resources/drawable-hdpi/launch.png delete mode 100644 src/Android/Resources/drawable-hdpi/lightbulb.png delete mode 100644 src/Android/Resources/drawable-hdpi/lock.png delete mode 100644 src/Android/Resources/drawable-hdpi/login.png delete mode 100644 src/Android/Resources/drawable-hdpi/logo.png delete mode 100644 src/Android/Resources/drawable-hdpi/more.png delete mode 100644 src/Android/Resources/drawable-hdpi/note.png delete mode 100644 src/Android/Resources/drawable-hdpi/notification_sm.png delete mode 100644 src/Android/Resources/drawable-hdpi/paperclip.png delete mode 100644 src/Android/Resources/drawable-hdpi/pencil.png delete mode 100644 src/Android/Resources/drawable-hdpi/plus.png delete mode 100644 src/Android/Resources/drawable-hdpi/refresh.png delete mode 100644 src/Android/Resources/drawable-hdpi/refresh_alt.png delete mode 100644 src/Android/Resources/drawable-hdpi/search.png delete mode 100644 src/Android/Resources/drawable-hdpi/share.png delete mode 100644 src/Android/Resources/drawable-hdpi/share_tools.png delete mode 100644 src/Android/Resources/drawable-hdpi/tools.png delete mode 100644 src/Android/Resources/drawable-hdpi/trash.png delete mode 100644 src/Android/Resources/drawable-hdpi/upload.png delete mode 100644 src/Android/Resources/drawable-hdpi/upload2.png delete mode 100644 src/Android/Resources/drawable-hdpi/user.png delete mode 100644 src/Android/Resources/drawable-hdpi/yubikey.png delete mode 100644 src/Android/Resources/drawable-xhdpi/accessibility_notification.png delete mode 100644 src/Android/Resources/drawable-xhdpi/accessibility_notification_icon.png delete mode 100644 src/Android/Resources/drawable-xhdpi/accessibility_step1.png delete mode 100644 src/Android/Resources/drawable-xhdpi/accessibility_step2.png delete mode 100644 src/Android/Resources/drawable-xhdpi/android.png delete mode 100644 src/Android/Resources/drawable-xhdpi/apple.png delete mode 100644 src/Android/Resources/drawable-xhdpi/autofill_enable.png delete mode 100644 src/Android/Resources/drawable-xhdpi/autofill_use.png delete mode 100644 src/Android/Resources/drawable-xhdpi/camera.png delete mode 100644 src/Android/Resources/drawable-xhdpi/card.png delete mode 100644 src/Android/Resources/drawable-xhdpi/clipboard.png delete mode 100644 src/Android/Resources/drawable-xhdpi/cloudup.png delete mode 100644 src/Android/Resources/drawable-xhdpi/cog.png delete mode 100644 src/Android/Resources/drawable-xhdpi/cog_alt.png delete mode 100644 src/Android/Resources/drawable-xhdpi/cogs.png delete mode 100644 src/Android/Resources/drawable-xhdpi/cube.png delete mode 100644 src/Android/Resources/drawable-xhdpi/download.png delete mode 100644 src/Android/Resources/drawable-xhdpi/envelope.png delete mode 100644 src/Android/Resources/drawable-xhdpi/eye.png delete mode 100644 src/Android/Resources/drawable-xhdpi/eye_slash.png delete mode 100644 src/Android/Resources/drawable-xhdpi/fa_lock.png delete mode 100644 src/Android/Resources/drawable-xhdpi/fingerprint.png delete mode 100644 src/Android/Resources/drawable-xhdpi/folder.png delete mode 100644 src/Android/Resources/drawable-xhdpi/folder_o.png delete mode 100644 src/Android/Resources/drawable-xhdpi/globe.png delete mode 100644 src/Android/Resources/drawable-xhdpi/icon.png delete mode 100644 src/Android/Resources/drawable-xhdpi/id.png delete mode 100644 src/Android/Resources/drawable-xhdpi/ion_chevron_right.png delete mode 100644 src/Android/Resources/drawable-xhdpi/launch.png delete mode 100644 src/Android/Resources/drawable-xhdpi/lightbulb.png delete mode 100644 src/Android/Resources/drawable-xhdpi/lock.png delete mode 100644 src/Android/Resources/drawable-xhdpi/login.png delete mode 100644 src/Android/Resources/drawable-xhdpi/more.png delete mode 100644 src/Android/Resources/drawable-xhdpi/note.png delete mode 100644 src/Android/Resources/drawable-xhdpi/notification_sm.png delete mode 100644 src/Android/Resources/drawable-xhdpi/paperclip.png delete mode 100644 src/Android/Resources/drawable-xhdpi/pencil.png delete mode 100644 src/Android/Resources/drawable-xhdpi/plus.png delete mode 100644 src/Android/Resources/drawable-xhdpi/refresh.png delete mode 100644 src/Android/Resources/drawable-xhdpi/refresh_alt.png delete mode 100644 src/Android/Resources/drawable-xhdpi/search.png delete mode 100644 src/Android/Resources/drawable-xhdpi/share.png delete mode 100644 src/Android/Resources/drawable-xhdpi/share_tools.png delete mode 100644 src/Android/Resources/drawable-xhdpi/tools.png delete mode 100644 src/Android/Resources/drawable-xhdpi/trash.png delete mode 100644 src/Android/Resources/drawable-xhdpi/upload.png delete mode 100644 src/Android/Resources/drawable-xhdpi/upload2.png delete mode 100644 src/Android/Resources/drawable-xhdpi/user.png delete mode 100644 src/Android/Resources/drawable-xhdpi/yubikey.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/accessibility_notification.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/accessibility_notification_icon.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/accessibility_step1.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/accessibility_step2.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/android.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/apple.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/autofill_enable.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/autofill_use.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/camera.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/card.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/clipboard.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/cloudup.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/cog.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/cog_alt.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/cogs.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/cube.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/download.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/envelope.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/eye.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/eye_slash.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/fa_lock.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/fingerprint.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/folder.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/folder_o.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/globe.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/icon.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/id.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/ion_chevron_right.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/launch.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/lightbulb.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/lock.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/login.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/logo.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/more.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/note.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/notification_sm.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/paperclip.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/pencil.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/plus.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/refresh.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/refresh_alt.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/search.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/share.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/share_tools.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/tools.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/trash.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/upload.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/upload2.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/user.png delete mode 100644 src/Android/Resources/drawable-xxhdpi/yubikey.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/android.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/apple.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/camera.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/card.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/clipboard.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/cloudup.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/cog.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/cog_alt.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/cogs.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/cube.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/download.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/envelope.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/eye.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/eye_slash.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/fa_lock.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/fingerprint.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/folder.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/folder_o.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/globe.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/icon.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/id.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/ion_chevron_right.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/launch.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/lightbulb.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/lock.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/login.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/more.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/note.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/notification_sm.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/paperclip.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/pencil.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/plus.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/refresh.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/refresh_alt.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/search.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/share.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/share_tools.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/tools.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/trash.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/upload.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/upload2.png delete mode 100644 src/Android/Resources/drawable-xxxhdpi/user.png delete mode 100644 src/Android/Resources/drawable/accessibility_notification.png delete mode 100644 src/Android/Resources/drawable/accessibility_notification_icon.png delete mode 100644 src/Android/Resources/drawable/accessibility_step1.png delete mode 100644 src/Android/Resources/drawable/accessibility_step2.png delete mode 100644 src/Android/Resources/drawable/android.png delete mode 100644 src/Android/Resources/drawable/apple.png delete mode 100644 src/Android/Resources/drawable/autofill_enable.png delete mode 100644 src/Android/Resources/drawable/autofill_use.png delete mode 100644 src/Android/Resources/drawable/bottom_nav_bg.xml delete mode 100644 src/Android/Resources/drawable/camera.png delete mode 100644 src/Android/Resources/drawable/card.png delete mode 100644 src/Android/Resources/drawable/clipboard.png delete mode 100644 src/Android/Resources/drawable/cloudup.png delete mode 100644 src/Android/Resources/drawable/cog.png delete mode 100644 src/Android/Resources/drawable/cog_alt.png delete mode 100644 src/Android/Resources/drawable/cogs.png delete mode 100644 src/Android/Resources/drawable/cube.png delete mode 100644 src/Android/Resources/drawable/download.png delete mode 100644 src/Android/Resources/drawable/envelope.png delete mode 100644 src/Android/Resources/drawable/eye.png delete mode 100644 src/Android/Resources/drawable/eye_slash.png delete mode 100644 src/Android/Resources/drawable/fa_lock.png delete mode 100644 src/Android/Resources/drawable/fingerprint.png delete mode 100644 src/Android/Resources/drawable/folder.png delete mode 100644 src/Android/Resources/drawable/folder_o.png delete mode 100644 src/Android/Resources/drawable/globe.png delete mode 100644 src/Android/Resources/drawable/icon.png delete mode 100644 src/Android/Resources/drawable/id.png delete mode 100644 src/Android/Resources/drawable/ion_chevron_right.png delete mode 100644 src/Android/Resources/drawable/launch.png delete mode 100644 src/Android/Resources/drawable/lightbulb.png delete mode 100644 src/Android/Resources/drawable/list_selector.xml delete mode 100644 src/Android/Resources/drawable/lock.png delete mode 100644 src/Android/Resources/drawable/login.png delete mode 100644 src/Android/Resources/drawable/logo.png delete mode 100644 src/Android/Resources/drawable/more.png delete mode 100644 src/Android/Resources/drawable/note.png delete mode 100644 src/Android/Resources/drawable/notification_sm.png delete mode 100644 src/Android/Resources/drawable/paperclip.png delete mode 100644 src/Android/Resources/drawable/pencil.png delete mode 100644 src/Android/Resources/drawable/plus.png delete mode 100644 src/Android/Resources/drawable/refresh.png delete mode 100644 src/Android/Resources/drawable/refresh_alt.png delete mode 100644 src/Android/Resources/drawable/search.png delete mode 100644 src/Android/Resources/drawable/share.png delete mode 100644 src/Android/Resources/drawable/share_tools.png delete mode 100644 src/Android/Resources/drawable/shield.png delete mode 100644 src/Android/Resources/drawable/slider_thumb.xml delete mode 100644 src/Android/Resources/drawable/splash_screen.xml delete mode 100644 src/Android/Resources/drawable/tools.png delete mode 100644 src/Android/Resources/drawable/upload.png delete mode 100644 src/Android/Resources/drawable/upload2.png delete mode 100644 src/Android/Resources/drawable/user.png delete mode 100644 src/Android/Resources/drawable/yubikey.png delete mode 100644 src/Android/Resources/layout/autofill_listitem.axml delete mode 100644 src/Android/Resources/layout/tabs.axml delete mode 100644 src/Android/Resources/layout/toolbar.axml delete mode 100644 src/Android/Resources/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 src/Android/Resources/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 src/Android/Resources/mipmap-hdpi/ic_launcher.png delete mode 100644 src/Android/Resources/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 src/Android/Resources/mipmap-hdpi/ic_launcher_round.png delete mode 100644 src/Android/Resources/mipmap-mdpi/ic_launcher.png delete mode 100644 src/Android/Resources/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 src/Android/Resources/mipmap-mdpi/ic_launcher_round.png delete mode 100644 src/Android/Resources/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 src/Android/Resources/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 src/Android/Resources/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 src/Android/Resources/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 src/Android/Resources/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src/Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 src/Android/Resources/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 src/Android/Resources/values-v21/styles.xml delete mode 100644 src/Android/Resources/values/colors.xml delete mode 100644 src/Android/Resources/values/ic_launcher_background.xml delete mode 100644 src/Android/Resources/values/strings.xml delete mode 100644 src/Android/Resources/values/styles.xml delete mode 100644 src/Android/Resources/xml/accessibilityservice.xml delete mode 100644 src/Android/Resources/xml/autofillservice.xml delete mode 100644 src/Android/Resources/xml/filepaths.xml delete mode 100644 src/Android/Resources/xml/network_security_config.xml delete mode 100644 src/Android/Services/AndroidKeyStoreStorageService.cs delete mode 100644 src/Android/Services/AndroidPushNotificationService.cs delete mode 100644 src/Android/Services/AppInfoService.cs delete mode 100644 src/Android/Services/BouncyCastleKeyDerivationService.cs delete mode 100644 src/Android/Services/DeviceActionService.cs delete mode 100644 src/Android/Services/DeviceInfoService.cs delete mode 100644 src/Android/Services/GoogleAnalyticsService.cs delete mode 100644 src/Android/Services/HttpService.cs delete mode 100644 src/Android/Services/LocalizeService.cs delete mode 100644 src/Android/Services/LogService.cs delete mode 100644 src/Android/Services/SqlService.cs delete mode 100644 src/Android/SplashActivity.cs delete mode 100644 src/Android/Utilities.cs delete mode 100644 src/Android/ci-build-apks.ps1 delete mode 100644 src/Android/google-services.json delete mode 100644 src/Android/google-services.json.enc delete mode 100644 src/Android/update-android.ps1 delete mode 100644 src/App/Abstractions/IDataObject.cs delete mode 100644 src/App/Abstractions/ITreeNodeObject.cs delete mode 100644 src/App/Abstractions/Repositories/IAccountsApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IAttachmentRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ICipherApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ICipherCollectionRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ICipherRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ICollectionRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IConnectApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IDeviceApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IFolderApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IFolderRepository.cs delete mode 100644 src/App/Abstractions/Repositories/IRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ISettingsApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ISettingsRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ISyncApiRepository.cs delete mode 100644 src/App/Abstractions/Repositories/ITwoFactorApiRepository.cs delete mode 100644 src/App/Abstractions/Services/IAppIdService.cs delete mode 100644 src/App/Abstractions/Services/IAppInfoService.cs delete mode 100644 src/App/Abstractions/Services/IAppSettingsService.cs delete mode 100644 src/App/Abstractions/Services/IAuthService.cs delete mode 100644 src/App/Abstractions/Services/ICipherService.cs delete mode 100644 src/App/Abstractions/Services/ICollectionService.cs delete mode 100644 src/App/Abstractions/Services/ICryptoService.cs delete mode 100644 src/App/Abstractions/Services/IDatabaseService.cs delete mode 100644 src/App/Abstractions/Services/IDeviceActionService.cs delete mode 100644 src/App/Abstractions/Services/IDeviceInfoService.cs delete mode 100644 src/App/Abstractions/Services/IFolderService.cs delete mode 100644 src/App/Abstractions/Services/IGoogleAnalyticsService.cs delete mode 100644 src/App/Abstractions/Services/IHttpService.cs delete mode 100644 src/App/Abstractions/Services/IKeyDerivationService.cs delete mode 100644 src/App/Abstractions/Services/ILocalizeService.cs delete mode 100644 src/App/Abstractions/Services/ILockService.cs delete mode 100644 src/App/Abstractions/Services/ILogService.cs delete mode 100644 src/App/Abstractions/Services/IPasswordGenerationService.cs delete mode 100644 src/App/Abstractions/Services/IPushNotification.cs delete mode 100644 src/App/Abstractions/Services/IPushNotificationListener.cs delete mode 100644 src/App/Abstractions/Services/ISecureStorageService.cs delete mode 100644 src/App/Abstractions/Services/ISettingsService.cs delete mode 100644 src/App/Abstractions/Services/ISqlService.cs delete mode 100644 src/App/Abstractions/Services/ISyncService.cs delete mode 100644 src/App/Abstractions/Services/ITokenService.cs delete mode 100644 src/App/App.cs delete mode 100644 src/App/App.csproj delete mode 100644 src/App/Constants.cs delete mode 100644 src/App/Controls/AddCipherToolBarItem.cs delete mode 100644 src/App/Controls/DismissModalToolBarItem.cs delete mode 100644 src/App/Controls/ExtendedButton.cs delete mode 100644 src/App/Controls/ExtendedContentPage.cs delete mode 100644 src/App/Controls/ExtendedEditor.cs delete mode 100644 src/App/Controls/ExtendedEntry.cs delete mode 100644 src/App/Controls/ExtendedListView.cs delete mode 100644 src/App/Controls/ExtendedNavigationPage.cs delete mode 100644 src/App/Controls/ExtendedPicker.cs delete mode 100644 src/App/Controls/ExtendedSwitchCell.cs delete mode 100644 src/App/Controls/ExtendedTabbedPage.cs delete mode 100644 src/App/Controls/ExtendedTableView.cs delete mode 100644 src/App/Controls/ExtendedTextCell.cs delete mode 100644 src/App/Controls/ExtendedToolbarItem.cs delete mode 100644 src/App/Controls/ExtendedViewCell.cs delete mode 100644 src/App/Controls/Fab.cs delete mode 100644 src/App/Controls/FabLayout.cs delete mode 100644 src/App/Controls/FormEditorCell.cs delete mode 100644 src/App/Controls/FormEntryCell.cs delete mode 100644 src/App/Controls/FormPickerCell.cs delete mode 100644 src/App/Controls/FormSwitchCell.cs delete mode 100644 src/App/Controls/HybridWebView.cs delete mode 100644 src/App/Controls/LabeledDetailCell.cs delete mode 100644 src/App/Controls/LabeledRightDetailCell.cs delete mode 100644 src/App/Controls/LabeledValueCell.cs delete mode 100644 src/App/Controls/PinControl.cs delete mode 100644 src/App/Controls/RedrawableStackLayout.cs delete mode 100644 src/App/Controls/SectionHeaderViewCell.cs delete mode 100644 src/App/Controls/StepperCell.cs delete mode 100644 src/App/Controls/VaultAttachmentsViewCell.cs delete mode 100644 src/App/Controls/VaultGroupingViewCell.cs delete mode 100644 src/App/Controls/VaultListViewCell.cs delete mode 100644 src/App/Enums/CipherType.cs delete mode 100644 src/App/Enums/DeviceType.cs delete mode 100644 src/App/Enums/EncryptionType.cs delete mode 100644 src/App/Enums/FieldType.cs delete mode 100644 src/App/Enums/KdfType.cs delete mode 100644 src/App/Enums/LockType.cs delete mode 100644 src/App/Enums/OrganizationUserStatusType.cs delete mode 100644 src/App/Enums/OrganizationUserType.cs delete mode 100644 src/App/Enums/PushType.cs delete mode 100644 src/App/Enums/ReturnType.cs delete mode 100644 src/App/Enums/SecureNoteType.cs delete mode 100644 src/App/Enums/TwoFactorProviderType.cs delete mode 100644 src/App/Enums/UriMatchType.cs delete mode 100644 src/App/Models/Api/ApiError.cs delete mode 100644 src/App/Models/Api/ApiResult.cs delete mode 100644 src/App/Models/Api/CardType.cs delete mode 100644 src/App/Models/Api/FieldType.cs delete mode 100644 src/App/Models/Api/IdentityType.cs delete mode 100644 src/App/Models/Api/LoginType.cs delete mode 100644 src/App/Models/Api/LoginUriType.cs delete mode 100644 src/App/Models/Api/Request/CipherRequest.cs delete mode 100644 src/App/Models/Api/Request/DeviceRequest.cs delete mode 100644 src/App/Models/Api/Request/DeviceTokenRequest.cs delete mode 100644 src/App/Models/Api/Request/FolderRequest.cs delete mode 100644 src/App/Models/Api/Request/PasswordHintRequest.cs delete mode 100644 src/App/Models/Api/Request/PasswordHistoryRequest.cs delete mode 100644 src/App/Models/Api/Request/PreloginRequest.cs delete mode 100644 src/App/Models/Api/Request/RegisterRequest.cs delete mode 100644 src/App/Models/Api/Request/TokenRequest.cs delete mode 100644 src/App/Models/Api/Request/TwoFactorEmailRequest.cs delete mode 100644 src/App/Models/Api/Response/AttachmentResponse.cs delete mode 100644 src/App/Models/Api/Response/CipherResponse.cs delete mode 100644 src/App/Models/Api/Response/CollectionResponse.cs delete mode 100644 src/App/Models/Api/Response/DeviceResponse.cs delete mode 100644 src/App/Models/Api/Response/DomainsResponse.cs delete mode 100644 src/App/Models/Api/Response/ErrorResponse.cs delete mode 100644 src/App/Models/Api/Response/FolderResponse.cs delete mode 100644 src/App/Models/Api/Response/KeysResponse.cs delete mode 100644 src/App/Models/Api/Response/ListResponse.cs delete mode 100644 src/App/Models/Api/Response/PasswordHistoryResponse.cs delete mode 100644 src/App/Models/Api/Response/PreloginResponse.cs delete mode 100644 src/App/Models/Api/Response/ProfileOrganizationResponse.cs delete mode 100644 src/App/Models/Api/Response/ProfileResponse.cs delete mode 100644 src/App/Models/Api/Response/SyncResponse.cs delete mode 100644 src/App/Models/Api/Response/TokenResponse.cs delete mode 100644 src/App/Models/Api/SecureNoteType.cs delete mode 100644 src/App/Models/AppOptions.cs delete mode 100644 src/App/Models/Attachment.cs delete mode 100644 src/App/Models/Card.cs delete mode 100644 src/App/Models/Cipher.cs delete mode 100644 src/App/Models/CipherString.cs delete mode 100644 src/App/Models/Collection.cs delete mode 100644 src/App/Models/Data/AttachmentData.cs delete mode 100644 src/App/Models/Data/CipherCollectionData.cs delete mode 100644 src/App/Models/Data/CipherData.cs delete mode 100644 src/App/Models/Data/CipherData/CardDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/CipherDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/FieldDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/IdentityDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/LoginDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/LoginUriDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/PasswordHistoryDataModel.cs delete mode 100644 src/App/Models/Data/CipherData/SecureNoteDataModel.cs delete mode 100644 src/App/Models/Data/CollectionData.cs delete mode 100644 src/App/Models/Data/FolderData.cs delete mode 100644 src/App/Models/Data/SettingsData.cs delete mode 100644 src/App/Models/DomainName.cs delete mode 100644 src/App/Models/Field.cs delete mode 100644 src/App/Models/Folder.cs delete mode 100644 src/App/Models/Identity.cs delete mode 100644 src/App/Models/Login.cs delete mode 100644 src/App/Models/LoginResult.cs delete mode 100644 src/App/Models/LoginUri.cs delete mode 100644 src/App/Models/OtpAuth.cs delete mode 100644 src/App/Models/Page/AppExtensionPageModel.cs delete mode 100644 src/App/Models/Page/PasswordGeneratorPageModel.cs delete mode 100644 src/App/Models/Page/PinPageModel.cs delete mode 100644 src/App/Models/Page/SettingsFolderPageModel.cs delete mode 100644 src/App/Models/Page/VaultAttachmentsPageModel.cs delete mode 100644 src/App/Models/Page/VaultListPageModel.cs delete mode 100644 src/App/Models/Page/VaultViewCipherPageModel.cs delete mode 100644 src/App/Models/PasswordHistory.cs delete mode 100644 src/App/Models/PlatformCulture.cs delete mode 100644 src/App/Models/PushNotification.cs delete mode 100644 src/App/Models/SecureNote.cs delete mode 100644 src/App/Models/SymmetricCryptoKey.cs delete mode 100644 src/App/Models/TreeNode.cs delete mode 100644 src/App/Pages/EnvironmentPage.cs delete mode 100644 src/App/Pages/HomePage.cs delete mode 100644 src/App/Pages/Lock/BaseLockPage.cs delete mode 100644 src/App/Pages/Lock/LockFingerprintPage.cs delete mode 100644 src/App/Pages/Lock/LockPasswordPage.cs delete mode 100644 src/App/Pages/Lock/LockPinPage.cs delete mode 100644 src/App/Pages/LoginPage.cs delete mode 100644 src/App/Pages/LoginTwoFactorPage.cs delete mode 100644 src/App/Pages/MainPage.cs delete mode 100644 src/App/Pages/PasswordHintPage.cs delete mode 100644 src/App/Pages/RegisterPage.cs delete mode 100644 src/App/Pages/ScanPage.cs delete mode 100644 src/App/Pages/Settings/SettingsAboutPage.cs delete mode 100644 src/App/Pages/Settings/SettingsAddFolderPage.cs delete mode 100644 src/App/Pages/Settings/SettingsCreditsPage.cs delete mode 100644 src/App/Pages/Settings/SettingsEditFolderPage.cs delete mode 100644 src/App/Pages/Settings/SettingsHelpPage.cs delete mode 100644 src/App/Pages/Settings/SettingsListFoldersPage.cs delete mode 100644 src/App/Pages/Settings/SettingsOptionsPage.cs delete mode 100644 src/App/Pages/Settings/SettingsPage.cs delete mode 100644 src/App/Pages/Settings/SettingsPinPage.cs delete mode 100644 src/App/Pages/Settings/SettingsSyncPage.cs delete mode 100644 src/App/Pages/Tools/ToolsAccessibilityServicePage.cs delete mode 100644 src/App/Pages/Tools/ToolsAutofillPage.cs delete mode 100644 src/App/Pages/Tools/ToolsAutofillServicePage.cs delete mode 100644 src/App/Pages/Tools/ToolsExtensionPage.cs delete mode 100644 src/App/Pages/Tools/ToolsPage.cs delete mode 100644 src/App/Pages/Tools/ToolsPasswordGeneratorPage.cs delete mode 100644 src/App/Pages/Vault/VaultAddCipherPage.cs delete mode 100644 src/App/Pages/Vault/VaultAttachmentsPage.cs delete mode 100644 src/App/Pages/Vault/VaultAutofillListCiphersPage.cs delete mode 100644 src/App/Pages/Vault/VaultEditCipherPage.cs delete mode 100644 src/App/Pages/Vault/VaultListCiphersPage.cs delete mode 100644 src/App/Pages/Vault/VaultListGroupingsPage.cs delete mode 100644 src/App/Pages/Vault/VaultViewCipherPage.cs delete mode 100644 src/App/Repositories/AccountsApiRepository.cs delete mode 100644 src/App/Repositories/ApiRepository.cs delete mode 100644 src/App/Repositories/AttachmentRepository.cs delete mode 100644 src/App/Repositories/BaseApiRepository.cs delete mode 100644 src/App/Repositories/BaseRepository.cs delete mode 100644 src/App/Repositories/CipherApiRepository.cs delete mode 100644 src/App/Repositories/CipherCollectionRepository.cs delete mode 100644 src/App/Repositories/CipherRepository.cs delete mode 100644 src/App/Repositories/CollectionRepository.cs delete mode 100644 src/App/Repositories/ConnectApiRepository.cs delete mode 100644 src/App/Repositories/DeviceApiRepository.cs delete mode 100644 src/App/Repositories/FolderApiRepository.cs delete mode 100644 src/App/Repositories/FolderRepository.cs delete mode 100644 src/App/Repositories/Repository.cs delete mode 100644 src/App/Repositories/SettingsApiRepository.cs delete mode 100644 src/App/Repositories/SettingsRepository.cs delete mode 100644 src/App/Repositories/SyncApiRepository.cs delete mode 100644 src/App/Repositories/TwoFactorApiRepository.cs delete mode 100644 src/App/Resources/AppResources.Designer.cs delete mode 100644 src/App/Resources/AppResources.bg.resx delete mode 100644 src/App/Resources/AppResources.cs.Designer.cs delete mode 100644 src/App/Resources/AppResources.cs.resx delete mode 100644 src/App/Resources/AppResources.da.Designer.cs delete mode 100644 src/App/Resources/AppResources.da.resx delete mode 100644 src/App/Resources/AppResources.de.Designer.cs delete mode 100644 src/App/Resources/AppResources.de.resx delete mode 100644 src/App/Resources/AppResources.en-GB.resx delete mode 100644 src/App/Resources/AppResources.es.Designer.cs delete mode 100644 src/App/Resources/AppResources.es.resx delete mode 100644 src/App/Resources/AppResources.et.resx delete mode 100644 src/App/Resources/AppResources.fa.resx delete mode 100644 src/App/Resources/AppResources.fi.Designer.cs delete mode 100644 src/App/Resources/AppResources.fi.resx delete mode 100644 src/App/Resources/AppResources.fr.Designer.cs delete mode 100644 src/App/Resources/AppResources.fr.resx delete mode 100644 src/App/Resources/AppResources.hi.Designer.cs delete mode 100644 src/App/Resources/AppResources.hi.resx delete mode 100644 src/App/Resources/AppResources.hr.Designer.cs delete mode 100644 src/App/Resources/AppResources.hr.resx delete mode 100644 src/App/Resources/AppResources.hu.Designer.cs delete mode 100644 src/App/Resources/AppResources.hu.resx delete mode 100644 src/App/Resources/AppResources.id.Designer.cs delete mode 100644 src/App/Resources/AppResources.id.resx delete mode 100644 src/App/Resources/AppResources.it.Designer.cs delete mode 100644 src/App/Resources/AppResources.it.resx delete mode 100644 src/App/Resources/AppResources.ja.Designer.cs delete mode 100644 src/App/Resources/AppResources.ja.resx delete mode 100644 src/App/Resources/AppResources.ko.resx delete mode 100644 src/App/Resources/AppResources.nb.resx delete mode 100644 src/App/Resources/AppResources.nl.Designer.cs delete mode 100644 src/App/Resources/AppResources.nl.resx delete mode 100644 src/App/Resources/AppResources.pl.Designer.cs delete mode 100644 src/App/Resources/AppResources.pl.resx delete mode 100644 src/App/Resources/AppResources.pt-BR.Designer.cs delete mode 100644 src/App/Resources/AppResources.pt-BR.resx delete mode 100644 src/App/Resources/AppResources.pt-PT.Designer.cs delete mode 100644 src/App/Resources/AppResources.pt-PT.resx delete mode 100644 src/App/Resources/AppResources.resx delete mode 100644 src/App/Resources/AppResources.ro.Designer.cs delete mode 100644 src/App/Resources/AppResources.ro.resx delete mode 100644 src/App/Resources/AppResources.ru.Designer.cs delete mode 100644 src/App/Resources/AppResources.ru.resx delete mode 100644 src/App/Resources/AppResources.sk.Designer.cs delete mode 100644 src/App/Resources/AppResources.sk.resx delete mode 100644 src/App/Resources/AppResources.sv.Designer.cs delete mode 100644 src/App/Resources/AppResources.sv.resx delete mode 100644 src/App/Resources/AppResources.th.Designer.cs delete mode 100644 src/App/Resources/AppResources.th.resx delete mode 100644 src/App/Resources/AppResources.tr.Designer.cs delete mode 100644 src/App/Resources/AppResources.tr.resx delete mode 100644 src/App/Resources/AppResources.uk.Designer.cs delete mode 100644 src/App/Resources/AppResources.uk.resx delete mode 100644 src/App/Resources/AppResources.vi.Designer.cs delete mode 100644 src/App/Resources/AppResources.vi.resx delete mode 100644 src/App/Resources/AppResources.zh-Hans.Designer.cs delete mode 100644 src/App/Resources/AppResources.zh-Hans.resx delete mode 100644 src/App/Resources/AppResources.zh-Hant.Designer.cs delete mode 100644 src/App/Resources/AppResources.zh-Hant.resx delete mode 100644 src/App/Resources/public_suffix_list.dat delete mode 100644 src/App/Services/AppIdService.cs delete mode 100644 src/App/Services/AppSettingsService.cs delete mode 100644 src/App/Services/AuthService.cs delete mode 100644 src/App/Services/CipherService.cs delete mode 100644 src/App/Services/CollectionService.cs delete mode 100644 src/App/Services/CryptoService.cs delete mode 100644 src/App/Services/DatabaseService.cs delete mode 100644 src/App/Services/FolderService.cs delete mode 100644 src/App/Services/LockService.cs delete mode 100644 src/App/Services/NoopGoogleAnalyticsService.cs delete mode 100644 src/App/Services/NoopPushNotificationListener.cs delete mode 100644 src/App/Services/NoopPushNotificationService.cs delete mode 100644 src/App/Services/PasswordGenerationService.cs delete mode 100644 src/App/Services/PushNotificationListener.cs delete mode 100644 src/App/Services/SettingsService.cs delete mode 100644 src/App/Services/SyncService.cs delete mode 100644 src/App/Services/TokenService.cs delete mode 100644 src/App/Utilities/ApiHttpClient.cs delete mode 100644 src/App/Utilities/Base32.cs delete mode 100644 src/App/Utilities/Colors.cs delete mode 100644 src/App/Utilities/Crypto.cs delete mode 100644 src/App/Utilities/ExtendedObservableCollection.cs delete mode 100644 src/App/Utilities/Extentions.cs delete mode 100644 src/App/Utilities/Helpers.cs delete mode 100644 src/App/Utilities/IdentityHttpClient.cs delete mode 100644 src/App/Utilities/PasswordFormatter.cs delete mode 100644 src/App/Utilities/TokenHttpRequestMessage.cs delete mode 100644 src/UWP.Images/UWP.Images.projitems delete mode 100644 src/UWP.Images/UWP.Images.shproj delete mode 100644 src/UWP.Images/android.png delete mode 100644 src/UWP.Images/apple.png delete mode 100644 src/UWP.Images/camera.png delete mode 100644 src/UWP.Images/card.png delete mode 100644 src/UWP.Images/clipboard.png delete mode 100644 src/UWP.Images/cloudup.png delete mode 100644 src/UWP.Images/cog.png delete mode 100644 src/UWP.Images/cog_alt.png delete mode 100644 src/UWP.Images/cogs.png delete mode 100644 src/UWP.Images/cogs_selected.png delete mode 100644 src/UWP.Images/download.png delete mode 100644 src/UWP.Images/envelope.png delete mode 100644 src/UWP.Images/eye.png delete mode 100644 src/UWP.Images/eye_slash.png delete mode 100644 src/UWP.Images/fa_lock.png delete mode 100644 src/UWP.Images/fa_lock_selected.png delete mode 100644 src/UWP.Images/folder.png delete mode 100644 src/UWP.Images/globe.png delete mode 100644 src/UWP.Images/icon.png delete mode 100644 src/UWP.Images/id.png delete mode 100644 src/UWP.Images/ion_chevron_left.png delete mode 100644 src/UWP.Images/ion_chevron_right.png delete mode 100644 src/UWP.Images/launch.png delete mode 100644 src/UWP.Images/lightbulb.png delete mode 100644 src/UWP.Images/lock.png delete mode 100644 src/UWP.Images/login.png delete mode 100644 src/UWP.Images/logo.png delete mode 100644 src/UWP.Images/more.png delete mode 100644 src/UWP.Images/more_selected.png delete mode 100644 src/UWP.Images/note.png delete mode 100644 src/UWP.Images/notification_sm.png delete mode 100644 src/UWP.Images/paperclip.png delete mode 100644 src/UWP.Images/photo.png delete mode 100644 src/UWP.Images/plus.png delete mode 100644 src/UWP.Images/refresh.png delete mode 100644 src/UWP.Images/refresh_alt.png delete mode 100644 src/UWP.Images/refresh_selected.png delete mode 100644 src/UWP.Images/search.png delete mode 100644 src/UWP.Images/share.png delete mode 100644 src/UWP.Images/share_tools.png delete mode 100644 src/UWP.Images/smile.png delete mode 100644 src/UWP.Images/tools.png delete mode 100644 src/UWP.Images/tools_selected.png delete mode 100644 src/UWP.Images/trash.png delete mode 100644 src/UWP.Images/upload.png delete mode 100644 src/UWP.Images/user.png delete mode 100644 src/UWP.Images/yubikey.png delete mode 100644 src/UWP/App.xaml delete mode 100644 src/UWP/App.xaml.cs delete mode 100644 src/UWP/Assets/BadgeLogo.scale-100.png delete mode 100644 src/UWP/Assets/BadgeLogo.scale-125.png delete mode 100644 src/UWP/Assets/BadgeLogo.scale-150.png delete mode 100644 src/UWP/Assets/BadgeLogo.scale-200.png delete mode 100644 src/UWP/Assets/BadgeLogo.scale-400.png delete mode 100644 src/UWP/Assets/LargeTile.scale-100.png delete mode 100644 src/UWP/Assets/LargeTile.scale-125.png delete mode 100644 src/UWP/Assets/LargeTile.scale-150.png delete mode 100644 src/UWP/Assets/LargeTile.scale-200.png delete mode 100644 src/UWP/Assets/LargeTile.scale-400.png delete mode 100644 src/UWP/Assets/LockScreenLogo.scale-200.png delete mode 100644 src/UWP/Assets/SmallTile.scale-100.png delete mode 100644 src/UWP/Assets/SmallTile.scale-125.png delete mode 100644 src/UWP/Assets/SmallTile.scale-150.png delete mode 100644 src/UWP/Assets/SmallTile.scale-200.png delete mode 100644 src/UWP/Assets/SmallTile.scale-400.png delete mode 100644 src/UWP/Assets/SplashScreen.scale-100.png delete mode 100644 src/UWP/Assets/SplashScreen.scale-125.png delete mode 100644 src/UWP/Assets/SplashScreen.scale-150.png delete mode 100644 src/UWP/Assets/SplashScreen.scale-200.png delete mode 100644 src/UWP/Assets/SplashScreen.scale-400.png delete mode 100644 src/UWP/Assets/Square150x150Logo.scale-100.png delete mode 100644 src/UWP/Assets/Square150x150Logo.scale-125.png delete mode 100644 src/UWP/Assets/Square150x150Logo.scale-150.png delete mode 100644 src/UWP/Assets/Square150x150Logo.scale-200.png delete mode 100644 src/UWP/Assets/Square150x150Logo.scale-400.png delete mode 100644 src/UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png delete mode 100644 src/UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png delete mode 100644 src/UWP/Assets/Square44x44Logo.altform-unplated_targetsize-32.png delete mode 100644 src/UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png delete mode 100644 src/UWP/Assets/Square44x44Logo.scale-100.png delete mode 100644 src/UWP/Assets/Square44x44Logo.scale-125.png delete mode 100644 src/UWP/Assets/Square44x44Logo.scale-150.png delete mode 100644 src/UWP/Assets/Square44x44Logo.scale-200.png delete mode 100644 src/UWP/Assets/Square44x44Logo.scale-400.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-16.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-24.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-256.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-32.png delete mode 100644 src/UWP/Assets/Square44x44Logo.targetsize-48.png delete mode 100644 src/UWP/Assets/StoreLogo.backup.png delete mode 100644 src/UWP/Assets/StoreLogo.scale-100.png delete mode 100644 src/UWP/Assets/StoreLogo.scale-125.png delete mode 100644 src/UWP/Assets/StoreLogo.scale-150.png delete mode 100644 src/UWP/Assets/StoreLogo.scale-200.png delete mode 100644 src/UWP/Assets/StoreLogo.scale-400.png delete mode 100644 src/UWP/Assets/Wide310x150Logo.scale-100.png delete mode 100644 src/UWP/Assets/Wide310x150Logo.scale-125.png delete mode 100644 src/UWP/Assets/Wide310x150Logo.scale-150.png delete mode 100644 src/UWP/Assets/Wide310x150Logo.scale-200.png delete mode 100644 src/UWP/Assets/Wide310x150Logo.scale-400.png delete mode 100644 src/UWP/Controls/ExtendedTableViewRenderer.cs delete mode 100644 src/UWP/IconConverter.cs delete mode 100644 src/UWP/MainPage.xaml delete mode 100644 src/UWP/MainPage.xaml.cs delete mode 100644 src/UWP/Package.appxmanifest delete mode 100644 src/UWP/Properties/AssemblyInfo.cs delete mode 100644 src/UWP/Properties/Default.rd.xml delete mode 100644 src/UWP/Services/AppInfoService.cs delete mode 100644 src/UWP/Services/DeviceActionService.cs delete mode 100644 src/UWP/Services/DeviceInfoService.cs delete mode 100644 src/UWP/Services/GoogleAnalyticsService.cs delete mode 100644 src/UWP/Services/HttpService.cs delete mode 100644 src/UWP/Services/KeyDerivationService.cs delete mode 100644 src/UWP/Services/LocalizeService.cs delete mode 100644 src/UWP/Services/LogService.cs delete mode 100644 src/UWP/Services/SecureStorageService.cs delete mode 100644 src/UWP/Services/SqlService.cs delete mode 100644 src/UWP/Services/UwpPushNotificationService.cs delete mode 100644 src/UWP/Styles.xaml delete mode 100644 src/UWP/UWP.csproj delete mode 100644 src/iOS.Autofill/AppDelegate.cs delete mode 100644 src/iOS.Autofill/CredentialProviderViewController.cs delete mode 100644 src/iOS.Autofill/CredentialProviderViewController.designer.cs delete mode 100644 src/iOS.Autofill/Entitlements.plist delete mode 100644 src/iOS.Autofill/Info.plist delete mode 100644 src/iOS.Autofill/LockFingerprintViewController.cs delete mode 100644 src/iOS.Autofill/LockFingerprintViewController.designer.cs delete mode 100644 src/iOS.Autofill/LockPasswordViewController.cs delete mode 100644 src/iOS.Autofill/LockPasswordViewController.designer.cs delete mode 100644 src/iOS.Autofill/LockPinViewController.cs delete mode 100644 src/iOS.Autofill/LockPinViewController.designer.cs delete mode 100644 src/iOS.Autofill/LoginAddViewController.cs delete mode 100644 src/iOS.Autofill/LoginAddViewController.designer.cs delete mode 100644 src/iOS.Autofill/LoginListViewController.cs delete mode 100644 src/iOS.Autofill/LoginListViewController.designer.cs delete mode 100644 src/iOS.Autofill/LoginSearchViewController.cs delete mode 100644 src/iOS.Autofill/LoginSearchViewController.designer.cs delete mode 100644 src/iOS.Autofill/Main.cs delete mode 100644 src/iOS.Autofill/MainInterface.storyboard delete mode 100644 src/iOS.Autofill/Models/Context.cs delete mode 100644 src/iOS.Autofill/PasswordGeneratorViewController.cs delete mode 100644 src/iOS.Autofill/PasswordGeneratorViewController.designer.cs delete mode 100644 src/iOS.Autofill/Properties/AssemblyInfo.cs delete mode 100644 src/iOS.Autofill/Resources/Icon.png delete mode 100644 src/iOS.Autofill/Resources/Icon@2x.png delete mode 100644 src/iOS.Autofill/Resources/Icon@3x.png delete mode 100644 src/iOS.Autofill/Resources/check.png delete mode 100644 src/iOS.Autofill/Resources/check@2x.png delete mode 100644 src/iOS.Autofill/Resources/check@3x.png delete mode 100644 src/iOS.Autofill/Resources/fingerprint.png delete mode 100644 src/iOS.Autofill/Resources/fingerprint@2x.png delete mode 100644 src/iOS.Autofill/Resources/fingerprint@3x.png delete mode 100644 src/iOS.Autofill/Resources/logo.png delete mode 100644 src/iOS.Autofill/Resources/logo@2x.png delete mode 100644 src/iOS.Autofill/Resources/logo@3x.png delete mode 100644 src/iOS.Autofill/Resources/smile.png delete mode 100644 src/iOS.Autofill/Resources/smile@2x.png delete mode 100644 src/iOS.Autofill/Resources/smile@3x.png delete mode 100644 src/iOS.Autofill/SetupViewController.cs delete mode 100644 src/iOS.Autofill/SetupViewController.designer.cs delete mode 100644 src/iOS.Autofill/Utilities/AutofillHelpers.cs delete mode 100644 src/iOS.Autofill/iOS.Autofill.csproj delete mode 100644 src/iOS.Core/Constants.cs delete mode 100644 src/iOS.Core/Controllers/ExtendedUITableViewController.cs delete mode 100644 src/iOS.Core/Controllers/ExtendedUIViewController.cs delete mode 100644 src/iOS.Core/Controllers/LockFingerprintViewController.cs delete mode 100644 src/iOS.Core/Controllers/LockPasswordViewController.cs delete mode 100644 src/iOS.Core/Controllers/LockPinViewController.cs delete mode 100644 src/iOS.Core/Controllers/LoginAddViewController.cs delete mode 100644 src/iOS.Core/Controllers/PasswordGeneratorViewController.cs delete mode 100644 src/iOS.Core/HockeyAppCrashManagerDelegate.cs delete mode 100644 src/iOS.Core/Models/AppExtensionContext.cs delete mode 100644 src/iOS.Core/Models/CipherViewModel.cs delete mode 100644 src/iOS.Core/Models/PasswordGenerationOptions.cs delete mode 100644 src/iOS.Core/Properties/AssemblyInfo.cs delete mode 100644 src/iOS.Core/Services/AppInfoService.cs delete mode 100644 src/iOS.Core/Services/CommonCryptoKeyDerivationService.cs delete mode 100644 src/iOS.Core/Services/DeviceInfoService.cs delete mode 100644 src/iOS.Core/Services/GoogleAnalyticsService.cs delete mode 100644 src/iOS.Core/Services/HttpService.cs delete mode 100644 src/iOS.Core/Services/KeyChainStorageService.cs delete mode 100644 src/iOS.Core/Services/LocalizeService.cs delete mode 100644 src/iOS.Core/Services/LogService.cs delete mode 100644 src/iOS.Core/Services/NoopDeviceActionService.cs delete mode 100644 src/iOS.Core/Services/Settings.cs delete mode 100644 src/iOS.Core/Services/SqlService.cs delete mode 100644 src/iOS.Core/Utilities/ASHelpers.cs delete mode 100644 src/iOS.Core/Utilities/Dialogs.cs delete mode 100644 src/iOS.Core/Views/ExtensionSearchDelegate.cs delete mode 100644 src/iOS.Core/Views/ExtensionTableSource.cs delete mode 100644 src/iOS.Core/Views/FormEntryTableViewCell.cs delete mode 100644 src/iOS.Core/Views/ISelectable.cs delete mode 100644 src/iOS.Core/Views/PickerTableViewCell.cs delete mode 100644 src/iOS.Core/Views/SliderTableViewCell.cs delete mode 100644 src/iOS.Core/Views/StepperTableViewCell.cs delete mode 100644 src/iOS.Core/Views/SwitchTableViewCell.cs delete mode 100644 src/iOS.Core/Views/Toast.cs delete mode 100644 src/iOS.Core/iOS.Core.csproj delete mode 100644 src/iOS.Extension/AppDelegate.cs delete mode 100644 src/iOS.Extension/Entitlements.plist delete mode 100644 src/iOS.Extension/Info.plist delete mode 100644 src/iOS.Extension/LoadingViewController.cs delete mode 100644 src/iOS.Extension/LoadingViewController.designer.cs delete mode 100644 src/iOS.Extension/LockFingerprintViewController.cs delete mode 100644 src/iOS.Extension/LockFingerprintViewController.designer.cs delete mode 100644 src/iOS.Extension/LockPasswordViewController.cs delete mode 100644 src/iOS.Extension/LockPasswordViewController.designer.cs delete mode 100644 src/iOS.Extension/LockPinViewController.cs delete mode 100644 src/iOS.Extension/LockPinViewController.designer.cs delete mode 100644 src/iOS.Extension/LoginAddViewController.cs delete mode 100644 src/iOS.Extension/LoginAddViewController.designer.cs delete mode 100644 src/iOS.Extension/LoginListViewController.cs delete mode 100644 src/iOS.Extension/LoginListViewController.designer.cs delete mode 100644 src/iOS.Extension/Main.cs delete mode 100644 src/iOS.Extension/MainInterface.storyboard delete mode 100644 src/iOS.Extension/Models/Context.cs delete mode 100644 src/iOS.Extension/Models/FillScript.cs delete mode 100644 src/iOS.Extension/Models/PageDetails.cs delete mode 100644 src/iOS.Extension/PasswordGeneratorViewController.cs delete mode 100644 src/iOS.Extension/PasswordGeneratorViewController.designer.cs delete mode 100644 src/iOS.Extension/Properties/AssemblyInfo.cs delete mode 100644 src/iOS.Extension/Resources/Icon.png delete mode 100644 src/iOS.Extension/Resources/Icon@2x.png delete mode 100644 src/iOS.Extension/Resources/Icon@3x.png delete mode 100644 src/iOS.Extension/Resources/ext-icon.png delete mode 100644 src/iOS.Extension/Resources/ext-icon@2x.png delete mode 100644 src/iOS.Extension/Resources/ext-icon@3x.png delete mode 100644 src/iOS.Extension/Resources/fingerprint.png delete mode 100644 src/iOS.Extension/Resources/fingerprint@2x.png delete mode 100644 src/iOS.Extension/Resources/fingerprint@3x.png delete mode 100644 src/iOS.Extension/Resources/logo.png delete mode 100644 src/iOS.Extension/Resources/logo@2x.png delete mode 100644 src/iOS.Extension/Resources/logo@3x.png delete mode 100644 src/iOS.Extension/Resources/smile.png delete mode 100644 src/iOS.Extension/Resources/smile@2x.png delete mode 100644 src/iOS.Extension/Resources/smile@3x.png delete mode 100644 src/iOS.Extension/SetupViewController.cs delete mode 100644 src/iOS.Extension/SetupViewController.designer.cs delete mode 100644 src/iOS.Extension/extension.js delete mode 100644 src/iOS.Extension/iOS.Extension.csproj delete mode 100644 src/iOS/AppDelegate.cs delete mode 100644 src/iOS/Controls/ContentPageRenderer.cs delete mode 100644 src/iOS/Controls/CustomButtonRenderer.cs delete mode 100644 src/iOS/Controls/CustomLabelRenderer.cs delete mode 100644 src/iOS/Controls/CustomSearchBarRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedButtonRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedEditorRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedEntryRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedListViewRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedPickerRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedSwitchCellRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedTabbedPageRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedTableViewRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedTextCellRenderer.cs delete mode 100644 src/iOS/Controls/ExtendedViewCellRenderer.cs delete mode 100644 src/iOS/Controls/HybridWebViewRenderer.cs delete mode 100644 src/iOS/Entitlements.plist delete mode 100644 src/iOS/Info.plist delete mode 100644 src/iOS/LaunchScreen.storyboard delete mode 100644 src/iOS/Main.cs delete mode 100644 src/iOS/NFCReaderDelegate.cs delete mode 100644 src/iOS/Properties/AssemblyInfo.cs delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Contents.json delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-1024.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-120.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-152.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-167.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-180.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-20.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-29.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-40.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-58.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-60.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-76.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-80.png delete mode 100644 src/iOS/Resources/Assets.xcassets/AppIcons.appiconset/Icon-87.png delete mode 100644 src/iOS/Resources/android.png delete mode 100644 src/iOS/Resources/android@2x.png delete mode 100644 src/iOS/Resources/android@3x.png delete mode 100644 src/iOS/Resources/apple.png delete mode 100644 src/iOS/Resources/apple@2x.png delete mode 100644 src/iOS/Resources/apple@3x.png delete mode 100644 src/iOS/Resources/autofill-kb.png delete mode 100644 src/iOS/Resources/autofill-kb@2x.png delete mode 100644 src/iOS/Resources/autofill-kb@3x.png delete mode 100644 src/iOS/Resources/camera.png delete mode 100644 src/iOS/Resources/camera@2x.png delete mode 100644 src/iOS/Resources/camera@3x.png delete mode 100644 src/iOS/Resources/card.png delete mode 100644 src/iOS/Resources/card@2x.png delete mode 100644 src/iOS/Resources/card@3x.png delete mode 100644 src/iOS/Resources/clipboard.png delete mode 100644 src/iOS/Resources/clipboard@2x.png delete mode 100644 src/iOS/Resources/clipboard@3x.png delete mode 100644 src/iOS/Resources/cloudup.png delete mode 100644 src/iOS/Resources/cloudup@2x.png delete mode 100644 src/iOS/Resources/cloudup@3x.png delete mode 100644 src/iOS/Resources/cog.png delete mode 100644 src/iOS/Resources/cog@2x.png delete mode 100644 src/iOS/Resources/cog@3x.png delete mode 100644 src/iOS/Resources/cog_alt.png delete mode 100644 src/iOS/Resources/cog_alt@2x.png delete mode 100644 src/iOS/Resources/cog_alt@3x.png delete mode 100644 src/iOS/Resources/cogs.png delete mode 100644 src/iOS/Resources/cogs@2x.png delete mode 100644 src/iOS/Resources/cogs@3x.png delete mode 100644 src/iOS/Resources/cube.png delete mode 100644 src/iOS/Resources/cube@2x.png delete mode 100644 src/iOS/Resources/cube@3x.png delete mode 100644 src/iOS/Resources/download.png delete mode 100644 src/iOS/Resources/download@2x.png delete mode 100644 src/iOS/Resources/download@3x.png delete mode 100644 src/iOS/Resources/envelope.png delete mode 100644 src/iOS/Resources/envelope@2x.png delete mode 100644 src/iOS/Resources/envelope@3x.png delete mode 100644 src/iOS/Resources/ext-act.png delete mode 100644 src/iOS/Resources/ext-act@2x.png delete mode 100644 src/iOS/Resources/ext-act@3x.png delete mode 100644 src/iOS/Resources/ext-more.png delete mode 100644 src/iOS/Resources/ext-more@2x.png delete mode 100644 src/iOS/Resources/ext-more@3x.png delete mode 100644 src/iOS/Resources/ext-use.png delete mode 100644 src/iOS/Resources/ext-use@2x.png delete mode 100644 src/iOS/Resources/ext-use@3x.png delete mode 100644 src/iOS/Resources/eye.png delete mode 100644 src/iOS/Resources/eye@2x.png delete mode 100644 src/iOS/Resources/eye@3x.png delete mode 100644 src/iOS/Resources/eye_slash.png delete mode 100644 src/iOS/Resources/eye_slash@2x.png delete mode 100644 src/iOS/Resources/eye_slash@3x.png delete mode 100644 src/iOS/Resources/fa_lock.png delete mode 100644 src/iOS/Resources/fa_lock@2x.png delete mode 100644 src/iOS/Resources/fa_lock@3x.png delete mode 100644 src/iOS/Resources/fingerprint.png delete mode 100644 src/iOS/Resources/fingerprint@2x.png delete mode 100644 src/iOS/Resources/fingerprint@3x.png delete mode 100644 src/iOS/Resources/folder.png delete mode 100644 src/iOS/Resources/folder@2x.png delete mode 100644 src/iOS/Resources/folder@3x.png delete mode 100644 src/iOS/Resources/folder_o.png delete mode 100644 src/iOS/Resources/folder_o@2x.png delete mode 100644 src/iOS/Resources/folder_o@3x.png delete mode 100644 src/iOS/Resources/globe.png delete mode 100644 src/iOS/Resources/globe@2x.png delete mode 100644 src/iOS/Resources/globe@3x.png delete mode 100644 src/iOS/Resources/id.png delete mode 100644 src/iOS/Resources/id@2x.png delete mode 100644 src/iOS/Resources/id@3x.png delete mode 100644 src/iOS/Resources/launch.png delete mode 100644 src/iOS/Resources/launch@2x.png delete mode 100644 src/iOS/Resources/launch@3x.png delete mode 100644 src/iOS/Resources/lightbulb.png delete mode 100644 src/iOS/Resources/lightbulb@2x.png delete mode 100644 src/iOS/Resources/lightbulb@3x.png delete mode 100644 src/iOS/Resources/lock.png delete mode 100644 src/iOS/Resources/lock@2x.png delete mode 100644 src/iOS/Resources/lock@3x.png delete mode 100644 src/iOS/Resources/login.png delete mode 100644 src/iOS/Resources/login@2x.png delete mode 100644 src/iOS/Resources/login@3x.png delete mode 100644 src/iOS/Resources/logo.png delete mode 100644 src/iOS/Resources/logo@2x.png delete mode 100644 src/iOS/Resources/logo@3x.png delete mode 100644 src/iOS/Resources/magic.png delete mode 100644 src/iOS/Resources/magic@2x.png delete mode 100644 src/iOS/Resources/magic@3x.png delete mode 100644 src/iOS/Resources/more.png delete mode 100644 src/iOS/Resources/more@2x.png delete mode 100644 src/iOS/Resources/more@3x.png delete mode 100644 src/iOS/Resources/more_selected.png delete mode 100644 src/iOS/Resources/more_selected@2x.png delete mode 100644 src/iOS/Resources/more_selected@3x.png delete mode 100644 src/iOS/Resources/note.png delete mode 100644 src/iOS/Resources/note@2x.png delete mode 100644 src/iOS/Resources/note@3x.png delete mode 100644 src/iOS/Resources/paperclip.png delete mode 100644 src/iOS/Resources/paperclip@2x.png delete mode 100644 src/iOS/Resources/paperclip@3x.png delete mode 100644 src/iOS/Resources/photo.png delete mode 100644 src/iOS/Resources/photo@2x.png delete mode 100644 src/iOS/Resources/photo@3x.png delete mode 100644 src/iOS/Resources/plus.png delete mode 100644 src/iOS/Resources/plus@2x.png delete mode 100644 src/iOS/Resources/plus@3x.png delete mode 100644 src/iOS/Resources/refresh.png delete mode 100644 src/iOS/Resources/refresh@2x.png delete mode 100644 src/iOS/Resources/refresh@3x.png delete mode 100644 src/iOS/Resources/refresh_alt.png delete mode 100644 src/iOS/Resources/refresh_alt@2x.png delete mode 100644 src/iOS/Resources/refresh_alt@3x.png delete mode 100644 src/iOS/Resources/search.png delete mode 100644 src/iOS/Resources/search@2x.png delete mode 100644 src/iOS/Resources/search@3x.png delete mode 100644 src/iOS/Resources/share.png delete mode 100644 src/iOS/Resources/share@2x.png delete mode 100644 src/iOS/Resources/share@3x.png delete mode 100644 src/iOS/Resources/share_tools.png delete mode 100644 src/iOS/Resources/share_tools@2x.png delete mode 100644 src/iOS/Resources/share_tools@3x.png delete mode 100644 src/iOS/Resources/smile.png delete mode 100644 src/iOS/Resources/smile@2x.png delete mode 100644 src/iOS/Resources/smile@3x.png delete mode 100644 src/iOS/Resources/tools.png delete mode 100644 src/iOS/Resources/tools@2x.png delete mode 100644 src/iOS/Resources/tools@3x.png delete mode 100644 src/iOS/Resources/trash.png delete mode 100644 src/iOS/Resources/trash@2x.png delete mode 100644 src/iOS/Resources/trash@3x.png delete mode 100644 src/iOS/Resources/upload.png delete mode 100644 src/iOS/Resources/upload@2x.png delete mode 100644 src/iOS/Resources/upload@3x.png delete mode 100644 src/iOS/Resources/user.png delete mode 100644 src/iOS/Resources/user@2x.png delete mode 100644 src/iOS/Resources/user@3x.png delete mode 100644 src/iOS/Resources/yubikey.png delete mode 100644 src/iOS/Resources/yubikey@2x.png delete mode 100644 src/iOS/Resources/yubikey@3x.png delete mode 100644 src/iOS/Services/DeviceActionService.cs delete mode 100644 src/iOS/Services/iOSPushNotificationHandler.cs delete mode 100644 src/iOS/Services/iOSPushNotificationService.cs delete mode 100644 src/iOS/iOS.csproj delete mode 100644 store/apple/bg/copy.resx delete mode 100644 store/apple/cs/copy.resx delete mode 100644 store/apple/da/copy.resx delete mode 100644 store/apple/de/copy.resx delete mode 100644 store/apple/en-GB/copy.resx delete mode 100644 store/apple/en/copy.resx delete mode 100644 store/apple/en/screenshots/3.5-inch (iPhone 4) - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/3.5-inch (iPhone 4) - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/3.5-inch (iPhone 4) - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/3.5-inch (iPhone 4) - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/3.5-inch (iPhone 4) - Screenshot 5.png delete mode 100644 store/apple/en/screenshots/4-inch (iPhone 5) - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/4-inch (iPhone 5) - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/4-inch (iPhone 5) - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/4-inch (iPhone 5) - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/4-inch (iPhone 5) - Screenshot 5.png delete mode 100644 store/apple/en/screenshots/4.7-inch (iPhone 6) - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/4.7-inch (iPhone 6) - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/4.7-inch (iPhone 6) - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/4.7-inch (iPhone 6) - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/4.7-inch (iPhone 6) - Screenshot 5.png delete mode 100644 store/apple/en/screenshots/5.5-inch (iPhone 6+) - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/5.5-inch (iPhone 6+) - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/5.5-inch (iPhone 6+) - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/5.5-inch (iPhone 6+) - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/5.5-inch (iPhone 6+) - Screenshot 5.png delete mode 100644 store/apple/en/screenshots/iPad - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/iPad - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/iPad - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/iPad - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/iPad - Screenshot 5.png delete mode 100644 store/apple/en/screenshots/iPad Pro - Screenshot 1.png delete mode 100644 store/apple/en/screenshots/iPad Pro - Screenshot 2.png delete mode 100644 store/apple/en/screenshots/iPad Pro - Screenshot 3.png delete mode 100644 store/apple/en/screenshots/iPad Pro - Screenshot 4.png delete mode 100644 store/apple/en/screenshots/iPad Pro - Screenshot 5.png delete mode 100644 store/apple/es/copy.resx delete mode 100644 store/apple/et/copy.resx delete mode 100644 store/apple/fa/copy.resx delete mode 100644 store/apple/fi/copy.resx delete mode 100644 store/apple/fr/copy.resx delete mode 100644 store/apple/hi/copy.resx delete mode 100644 store/apple/hr/copy.resx delete mode 100644 store/apple/hu/copy.resx delete mode 100644 store/apple/id/copy.resx delete mode 100644 store/apple/it/copy.resx delete mode 100644 store/apple/ja/copy.resx delete mode 100644 store/apple/ko/copy.resx delete mode 100644 store/apple/nb/copy.resx delete mode 100644 store/apple/nl/copy.resx delete mode 100644 store/apple/pl/copy.resx delete mode 100644 store/apple/pt-BR/copy.resx delete mode 100644 store/apple/pt-PT/copy.resx delete mode 100644 store/apple/ro/copy.resx delete mode 100644 store/apple/ru/copy.resx delete mode 100644 store/apple/sk/copy.resx delete mode 100644 store/apple/sv/copy.resx delete mode 100644 store/apple/th/copy.resx delete mode 100644 store/apple/tr/copy.resx delete mode 100644 store/apple/uk/copy.resx delete mode 100644 store/apple/vi/copy.resx delete mode 100644 store/apple/zh-Hans/copy.resx delete mode 100644 store/apple/zh-Hant/copy.resx delete mode 100644 store/google/Publisher/Program.cs delete mode 100644 store/google/Publisher/Publisher.csproj delete mode 100644 store/google/Publisher/play_creds.json.enc delete mode 100644 store/google/bg/copy.resx delete mode 100644 store/google/cs/copy.resx delete mode 100644 store/google/da/copy.resx delete mode 100644 store/google/de/copy.resx delete mode 100644 store/google/en-GB/copy.resx delete mode 100644 store/google/en/assets/feature-graphic.png delete mode 100644 store/google/en/copy.resx delete mode 100644 store/google/en/screenshots/Nexus 6P - Screenshot 1.png delete mode 100644 store/google/en/screenshots/Nexus 6P - Screenshot 2.png delete mode 100644 store/google/en/screenshots/Nexus 6P - Screenshot 3.png delete mode 100644 store/google/en/screenshots/Nexus 6P - Screenshot 4.png delete mode 100644 store/google/en/screenshots/Nexus 6P - Screenshot 5.png delete mode 100644 store/google/en/screenshots/Nexus 7 - Screenshot 1.png delete mode 100644 store/google/en/screenshots/Nexus 7 - Screenshot 2.png delete mode 100644 store/google/en/screenshots/Nexus 7 - Screenshot 3.png delete mode 100644 store/google/en/screenshots/Nexus 7 - Screenshot 4.png delete mode 100644 store/google/en/screenshots/Nexus 7 - Screenshot 5.png delete mode 100644 store/google/es/copy.resx delete mode 100644 store/google/et/copy.resx delete mode 100644 store/google/fa/copy.resx delete mode 100644 store/google/fi/copy.resx delete mode 100644 store/google/fr/copy.resx delete mode 100644 store/google/hi/copy.resx delete mode 100644 store/google/hr/copy.resx delete mode 100644 store/google/hu/copy.resx delete mode 100644 store/google/icons/hi-res-icon.png delete mode 100644 store/google/id/copy.resx delete mode 100644 store/google/it/copy.resx delete mode 100644 store/google/ja/copy.resx delete mode 100644 store/google/ko/copy.resx delete mode 100644 store/google/nb/copy.resx delete mode 100644 store/google/nl/copy.resx delete mode 100644 store/google/pl/copy.resx delete mode 100644 store/google/pt-BR/copy.resx delete mode 100644 store/google/pt-PT/copy.resx delete mode 100644 store/google/pt/copy.resx delete mode 100644 store/google/ro/copy.resx delete mode 100644 store/google/ru/copy.resx delete mode 100644 store/google/sk/copy.resx delete mode 100644 store/google/sv/copy.resx delete mode 100644 store/google/th/copy.resx delete mode 100644 store/google/tr/copy.resx delete mode 100644 store/google/uk/copy.resx delete mode 100644 store/google/vi/copy.resx delete mode 100644 store/google/zh-Hans/copy.resx delete mode 100644 store/google/zh-Hant/copy.resx delete mode 100644 test/App.Test/App.Test.csproj delete mode 100644 test/App.Test/CryptoServiceTests.cs delete mode 100644 test/App.Test/PasswordGeneratorServiceTests.cs delete mode 100644 test/App.Test/Properties/AssemblyInfo.cs delete mode 100644 test/App.Test/app.config diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 0841a3c86..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,29 +0,0 @@ -#init: -# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) -#on_finish: -# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) -#install: -# - choco install cloc --no-progress -# - "cloc --vcs git --exclude-dir Resources,store,test,UWP,Properties --include-lang C#,JavaScript,TypeScript,PowerShell" -# - appveyor DownloadFile https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -# - appveyor DownloadFile https://aka.ms/vs/15/release/vs_community.exe -# - vs_community.exe update --wait --quiet --norestart --installPath "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community" -# - ps: .\src\Android\update-android.ps1 -before_build: - - nuget restore - - IF DEFINED keystore_dec_secret nuget install secure-file -ExcludeVersion - - IF DEFINED google_services_dec_secret secure-file\tools\secure-file -decrypt src\Android\google-services.json.enc -secret %google_services_dec_secret% -after_build: - - ps: IF($env:keystore_dec_secret) { .\src\Android\ci-build-apks.ps1 } -on_success: - - IF DEFINED play_dec_secret secure-file\tools\secure-file -decrypt store\google\Publisher\play_creds.json.enc -secret %play_dec_secret% - - IF DEFINED play_dec_secret dotnet store\google\Publisher\bin\Release\netcoreapp2.0\Publisher.dll %APPVEYOR_BUILD_FOLDER%\store\google\Publisher\play_creds.json %APPVEYOR_BUILD_FOLDER%\com.x8bit.bitwarden-%APPVEYOR_BUILD_NUMBER%.apk alpha -artifacts: - - path: com.x8bit.bitwarden-%APPVEYOR_BUILD_NUMBER%.apk - - path: com.x8bit.bitwarden-fdroid-%APPVEYOR_BUILD_NUMBER%.apk -branches: - except: - - l10n_master -skip_tags: true -configuration: Release -image: Visual Studio 2017 diff --git a/bitwarden-mobile.sln b/bitwarden-mobile.sln deleted file mode 100644 index 417cf1c94..000000000 --- a/bitwarden-mobile.sln +++ /dev/null @@ -1,523 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "src\Android\Android.csproj", "{04B18ED2-B76D-4947-8474-191F8FD2B5E0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "src\iOS\iOS.csproj", "{1F78403F-9A28-405B-9289-B9DBEB55F074}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EC730FD9-F623-4B6C-B503-95CDCFBCF277}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App.Test", "test\App.Test\App.Test.csproj", "{A300DCE1-8D10-4267-B96A-CB01AEB7C220}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Extension", "src\iOS.Extension\iOS.Extension.csproj", "{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Core", "src\iOS.Core\iOS.Core.csproj", "{B2538ADA-B605-4D6F-ACD2-62A409680F84}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "store", "store", "{92470CBD-9047-4C3C-8EA3-D972D6622D84}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "google", "google", "{2E399654-26A2-46F6-B9CA-1B496A3F370A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "src\App\App.csproj", "{8A279EE4-4537-4656-9C93-44945E594556}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Publisher", "store\google\Publisher\Publisher.csproj", "{D5D91152-CB01-4F24-A503-304D3A94408B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F0E2E596-C3DB-474A-9C88-7824662894FA}" - ProjectSection(SolutionItems) = preProject - .gitignore = .gitignore - appveyor.yml = appveyor.yml - crowdin.yml = crowdin.yml - README.md = README.md - SECURITY.md = SECURITY.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Autofill", "src\iOS.Autofill\iOS.Autofill.csproj", "{C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Ad-Hoc|Any CPU = Ad-Hoc|Any CPU - Ad-Hoc|ARM = Ad-Hoc|ARM - Ad-Hoc|iPhone = Ad-Hoc|iPhone - Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator - Ad-Hoc|x64 = Ad-Hoc|x64 - Ad-Hoc|x86 = Ad-Hoc|x86 - AppStore|Any CPU = AppStore|Any CPU - AppStore|ARM = AppStore|ARM - AppStore|iPhone = AppStore|iPhone - AppStore|iPhoneSimulator = AppStore|iPhoneSimulator - AppStore|x64 = AppStore|x64 - AppStore|x86 = AppStore|x86 - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM - Debug|iPhone = Debug|iPhone - Debug|iPhoneSimulator = Debug|iPhoneSimulator - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - FDroid|Any CPU = FDroid|Any CPU - FDroid|ARM = FDroid|ARM - FDroid|iPhone = FDroid|iPhone - FDroid|iPhoneSimulator = FDroid|iPhoneSimulator - FDroid|x64 = FDroid|x64 - FDroid|x86 = FDroid|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|iPhone = Release|iPhone - Release|iPhoneSimulator = Release|iPhoneSimulator - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.Build.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.Deploy.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x64.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.ActiveCfg = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Build.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Deploy.0 = Debug|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.ActiveCfg = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.Build.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.Deploy.0 = FDroid|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|iPhone.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.Deploy.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.ActiveCfg = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.Build.0 = Release|Any CPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.Deploy.0 = Release|Any CPU - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|ARM.ActiveCfg = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhone.Build.0 = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|x64.ActiveCfg = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|x86.ActiveCfg = AppStore|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|ARM.ActiveCfg = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhone.ActiveCfg = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhone.Build.0 = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x64.ActiveCfg = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.ActiveCfg = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.Build.0 = Debug|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|Any CPU.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|Any CPU.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|ARM.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|ARM.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhone.ActiveCfg = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhone.Build.0 = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x64.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x64.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x86.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x86.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|Any CPU.ActiveCfg = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|ARM.ActiveCfg = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhone.ActiveCfg = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhone.Build.0 = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|x64.ActiveCfg = Release|iPhone - {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|x86.ActiveCfg = Release|iPhone - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|ARM.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x64.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x86.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|Any CPU.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|ARM.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|ARM.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x64.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x64.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x86.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x86.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|ARM.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|ARM.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x64.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|Any CPU.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|Any CPU.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|ARM.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|ARM.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhone.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhone.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhoneSimulator.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x64.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x64.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x86.ActiveCfg = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x86.Build.0 = Debug|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|ARM.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|ARM.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|iPhone.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x64.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x64.Build.0 = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x86.ActiveCfg = Release|Any CPU - {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x86.Build.0 = Release|Any CPU - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|ARM.ActiveCfg = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhone.Build.0 = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|x64.ActiveCfg = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|x86.ActiveCfg = AppStore|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|ARM.ActiveCfg = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhone.ActiveCfg = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhone.Build.0 = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x64.ActiveCfg = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.ActiveCfg = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.Build.0 = Debug|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|Any CPU.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|Any CPU.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|ARM.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|ARM.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhone.ActiveCfg = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhone.Build.0 = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x64.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x64.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x86.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x86.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|Any CPU.ActiveCfg = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|ARM.ActiveCfg = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhone.ActiveCfg = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhone.Build.0 = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|x64.ActiveCfg = Release|iPhone - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|x86.ActiveCfg = Release|iPhone - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|ARM.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x64.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x86.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|Any CPU.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|Any CPU.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|ARM.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|ARM.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhone.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhone.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x64.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x64.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x86.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x86.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|ARM.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhone.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x64.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|Any CPU.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|Any CPU.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|ARM.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|ARM.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhone.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhone.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhoneSimulator.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x64.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x64.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x86.ActiveCfg = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x86.Build.0 = Debug|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|ARM.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhone.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhone.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x64.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x64.Build.0 = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x86.ActiveCfg = Release|Any CPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x86.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|ARM.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhone.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x64.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x64.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x86.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x86.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|ARM.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|ARM.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhone.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x64.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x64.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x86.ActiveCfg = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x86.Build.0 = Debug|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|Any CPU.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|ARM.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|ARM.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhone.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x64.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x64.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x86.ActiveCfg = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x86.Build.0 = FDroid|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|Any CPU.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|ARM.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|ARM.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhone.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhone.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|x64.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|x64.Build.0 = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|x86.ActiveCfg = Release|Any CPU - {8A279EE4-4537-4656-9C93-44945E594556}.Release|x86.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|ARM.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhone.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x64.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x64.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x86.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x86.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|ARM.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|ARM.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhone.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x64.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x64.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x86.ActiveCfg = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x86.Build.0 = Debug|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|Any CPU.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|Any CPU.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|ARM.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|ARM.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhone.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhone.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhoneSimulator.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhoneSimulator.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x64.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x64.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x86.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x86.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|Any CPU.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|ARM.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|ARM.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhone.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhone.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x64.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x64.Build.0 = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x86.ActiveCfg = Release|Any CPU - {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x86.Build.0 = Release|Any CPU - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|ARM.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhone.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|x64.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|x86.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|ARM.ActiveCfg = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhone.ActiveCfg = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhone.Build.0 = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|x64.ActiveCfg = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|x86.ActiveCfg = Debug|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|Any CPU.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|Any CPU.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|ARM.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|ARM.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhone.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhone.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x64.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x64.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x86.ActiveCfg = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x86.Build.0 = AppStore|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|Any CPU.ActiveCfg = Release|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|ARM.ActiveCfg = Release|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhone.ActiveCfg = Release|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhone.Build.0 = Release|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|x64.ActiveCfg = Release|iPhone - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|x86.ActiveCfg = Release|iPhone - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {04B18ED2-B76D-4947-8474-191F8FD2B5E0} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - {1F78403F-9A28-405B-9289-B9DBEB55F074} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - {A300DCE1-8D10-4267-B96A-CB01AEB7C220} = {0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D} - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - {B2538ADA-B605-4D6F-ACD2-62A409680F84} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - {2E399654-26A2-46F6-B9CA-1B496A3F370A} = {92470CBD-9047-4C3C-8EA3-D972D6622D84} - {8A279EE4-4537-4656-9C93-44945E594556} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - {D5D91152-CB01-4F24-A503-304D3A94408B} = {2E399654-26A2-46F6-B9CA-1B496A3F370A} - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {318CB2DF-0118-43A3-AC83-56BADCF71CCD} - EndGlobalSection -EndGlobal diff --git a/src/Android/8bit.keystore.enc b/src/Android/8bit.keystore.enc deleted file mode 100644 index 0318720af208e0a45a7b28cf1f4098610f2c39e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2288 zcmVYOBj?yZ+??f(}1gXXX#46)` zNW(ur80=YUQ)Xs~=!ik%#z4B6aa~jdpGc~Wt8V~YUTV-SPP5&~hl2*`7zhgTME|y9 zh|9NEEN6?*Frsf1VQ(;g70$tnV}xa#-C3nqExEIFq;$2f)s-T9e;7EB1y#wco#Z@I zWffAAS`K1)kIK$+=k+w~84ie^u3EgR#a}hX)e)B&_#sT)ivu{T}qiqG@P&kk~8ALf_&A<|ml3Vg+bDl$?$!AL|yh9yz2}v=V?fHg}QemTE>ii_&VrRjyrl1f=xcHF?|%og)S`Ai>kyeQSGudzr#rwse3G!u&FH64^_R61J;+YcPf zqL(qDF_T#E<*)j2Exs9*HN(R!zlPuijEOE<+%#Q@Wg91F4F{$`)@z}F4fhko+XIY= z>uI0U%mL;U)K1WY#lMk{w?mH|6;k@!w`8-XJ|SW&RGzu|DXHaX#Ji0f_9_23j;!mV zbh38Tji&Ly0Or$@)G?>TQ*y+(L7sCoJYF#|x-)+wG=~_Bc0Duf=k(Hvut$LQSSdTeiqCHtk{;D@TSAp zu1h4N&1PbfvCInAT#;fB^Q{MTrf1is=U3+0`IR9KO-Hd=MPFbl*c>&2M5s$+;IwH! zJ*@FO#X*?*x71%KL~{s>nl5jkCPyvtBIt%pX)qG1;%)B^rAHU&(C`;FSC}iQm3}NM zz=HmP5P>{!p%iZYR%M`Nm^VTct{cV$k^*0O7$gVi7=nFgz&ScUZF)AOLT)(XdZ|FZ z5*%_s?n1cn$Z_M?Y*TVA#LyWPxNp5{#uJ10X-5sHZNMygsKADjvQ#~sG$H)3I(erR z!pNys(WvSOdU3{ELqZlNHt6WS6R!-sAa=W6VH@ygt%4lHoZX67kIK(E*XQ^{My?8K zS`-lHqaM8w@)c+yw743#dzNMw?At|ZPSBZ23Cc|xSv4qg^GwpWNZ{5FFp5Uls-})F zr!!9ef@q6C;ick6#+g8uPNc|qtKFn@b}E0XKMEcWld7N2Ac61P06L{Eua<>=-U4-18WrF{ABk4{=FnUk#ivq*?%&a2bg@VpRO` zh4;mEa_{{cGvd?0>%_#r6*!m-PTX>ycjANul3o8-r+cspPPf>RlT zj>K?h`F);*6Fe2MS6=tCQE7fu{f6X?zyzA?vDx-*8k{ugz^qlJWUk}!fSi_Pwwx@QskSEwGISjNsCp33E`Y=R|tr0~qqHt!F;jAdP_el00 z`|%?ax9F#h6&`gStF=QmiuRVd$|AMmKGWKmuUY1!Ui$iUmFX@5$TxhU^F0--+MQ}@ zmx<(1vB&>&Pw-4Kp1M3QU;)9-CMGrxT2!~xH`}COO1ZvpM+~=h9m(!S!H3x*tAm&F zqGsyE$HPm*qgEbm=R14?O{ZLLBj<_BAY`+ z%vz0{e*`FZ$o^%{TW(5!*%^SQ@;7YqC-O`Q+s+f}pGX&5VD->Z-$2EJR@3V!mJu!D=OEpBKCuN zd=POv2S%Pp1Nlf$GePN0%GZ*Wrir$wZRo8No2YL2Fe4qIhNjHxRNiy(rO9lI{_Zr2 zOlA(y1J9AO1`j*v2OFl8l{JcRo|^YBzti5PH|vMNTRHLlX!UgSc~EZa4a`z|pGR&3 zUp>!0--D;mB!a-g<|?qY$9)P}R+86V-F<)3)jZI^VOJ)?DhH8?c2y&{doJXAV};tP z5X)&ECD0Ws`H$>7-e&-VkgRDLqPJYmZ)^0^srGm+I?YnOe!@^IH!60PzprfDb64D^ zFfFqOk?T>s1%@Gxu+Ne34IWaL7O2B9+he||kVOAxgG%$z0ewj!{b#6)w81(ob!OXd4@3#vw=MD28C5Mc%F?(YK(mbc0OTELlmoRHNHv-H%nSOl`~`8F)~UKt zGBP>TYX?UAir*Z}&$~hG>d?@3kY1l4QXyf;*-ba|o6P$dcAf@bj(pfm;GnXUlGOqs z+DEr(ytK$d?$JBIO@~(=U=vcY8XS_}8+$w%B%`?-Wh8+>&fZEaz{E=OF*audN`fav KIlQ^-3ger=1#qnZ diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj deleted file mode 100644 index c1246e57a..000000000 --- a/src/Android/Android.csproj +++ /dev/null @@ -1,1025 +0,0 @@ - - - - Debug - AnyCPU - {04B18ED2-B76D-4947-8474-191F8FD2B5E0} - {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - Bit.Android - BitwardenAndroid - 512 - true - Resources\Resource.Designer.cs - Off - Properties\AndroidManifest.xml - false - v9.0 - armeabi,armeabi-v7a,x86 - Xamarin.Android.Net.AndroidClientHandler - - - - - - - - - True - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - True - None - PushNotification.Plugin;PushNotification.Plugin.Abstractions;Xamarin.GooglePlayServices.Base;Xamarin.GooglePlayServices.Basement;Xamarin.GooglePlayServices.Measurement;Xamarin.GooglePlayServices.Gcm;BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net - True - False - False - Xamarin - False - 1G - Xamarin.Android.Net.AndroidClientHandler - False - False - False - btls - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - False - Full - True - False - False - Xamarin - False - False - False - False - False - 1G - PushNotification.Plugin;PushNotification.Plugin.Abstractions;Xamarin.GooglePlayServices.Base;Xamarin.GooglePlayServices.Basement;Xamarin.GooglePlayServices.Measurement;Xamarin.GooglePlayServices.Gcm;BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net - Xamarin.Android.Net.AndroidClientHandler - armeabi;armeabi-v7a;x86;x86_64;arm64-v8a - btls - SHA1withRSA - - - bin\FDroid\ - TRACE;FDROID - true - pdbonly - AnyCPU - Off - prompt - MinimumRecommendedRules.ruleset - false - true - Full - BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net - btls - armeabi;armeabi-v7a;x86;x86_64;arm64-v8a - 1G - SHA1withRSA - - - - - - False - .\Naxam.Ittianyu.BottomNavExtension.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - AndroidResource - - - AndroidResource - - - AndroidResource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {8a279ee4-4537-4656-9c93-44945e594556} - App - - - - - 60.1142.1 - - - 4.4.0 - - - 27.0.2.1 - - - 27.0.2.1 - - - 27.0.2.1 - - - 27.0.2.1 - - - 27.0.2.1 - - - 60.1142.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Android/Assets/AboutAssets.txt b/src/Android/Assets/AboutAssets.txt deleted file mode 100644 index 5ddf08729..000000000 --- a/src/Android/Assets/AboutAssets.txt +++ /dev/null @@ -1,19 +0,0 @@ -Any raw assets you want to be deployed with your application can be placed in -this directory (and child directories) and given a Build Action of "AndroidAsset". - -These files will be deployed with you package and will be accessible using Android's -AssetManager, like this: - -public class ReadAsset : Activity -{ - protected override void OnCreate (Bundle bundle) - { - base.OnCreate (bundle); - - InputStream input = Assets.Open ("my_asset.txt"); - } -} - -Additionally, some Android functions will automatically load asset files: - -Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); diff --git a/src/Android/Autofill/AutofillHelpers.cs b/src/Android/Autofill/AutofillHelpers.cs deleted file mode 100644 index 792a56a71..000000000 --- a/src/Android/Autofill/AutofillHelpers.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Collections.Generic; -using Android.Content; -using Android.Service.Autofill; -using Android.Widget; -using System.Linq; -using Android.App; -using Bit.App.Abstractions; -using System.Threading.Tasks; -using Bit.App.Resources; -using Bit.App.Enums; -using Android.Views.Autofill; - -namespace Bit.Android.Autofill -{ - public static class AutofillHelpers - { - private static int _pendingIntentId = 0; - - // These browser work natively with the autofill framework - public static HashSet TrustedBrowsers = new HashSet - { - "org.mozilla.focus","org.mozilla.klar","com.duckduckgo.mobile.android" - }; - - // These browsers work using the compatibility shim for the autofill framework - public static HashSet CompatBrowsers = new HashSet - { - "org.mozilla.firefox","org.mozilla.firefox_beta","com.microsoft.emmx","com.android.chrome", - "com.chrome.beta","com.android.browser","com.brave.browser","com.opera.browser", - "com.opera.browser.beta","com.opera.mini.native","com.chrome.dev","com.chrome.canary", - "com.google.android.apps.chrome","com.google.android.apps.chrome_dev","com.yandex.browser", - "com.sec.android.app.sbrowser","com.sec.android.app.sbrowser.beta","org.codeaurora.swe.browser", - "com.amazon.cloud9","mark.via.gp","org.bromite.bromite","org.chromium.chrome","com.kiwibrowser.browser", - "com.ecosia.android","com.opera.mini.native.beta","org.mozilla.fennec_aurora","com.qwant.liberty", - "com.opera.touch" - }; - - // The URLs are blacklisted from autofilling - public static HashSet BlacklistedUris = new HashSet - { - "androidapp://android", "androidapp://com.x8bit.bitwarden", "androidapp://com.oneplus.applocker" - }; - - public static async Task> GetFillItemsAsync(Parser parser, ICipherService service) - { - var items = new List(); - - if(parser.FieldCollection.FillableForLogin) - { - var ciphers = await service.GetAllAsync(parser.Uri); - if(ciphers.Item1.Any() || ciphers.Item2.Any()) - { - var allCiphers = ciphers.Item1.ToList(); - allCiphers.AddRange(ciphers.Item2.ToList()); - foreach(var cipher in allCiphers) - { - items.Add(new FilledItem(cipher)); - } - } - } - else if(parser.FieldCollection.FillableForCard) - { - var ciphers = await service.GetAllAsync(); - foreach(var cipher in ciphers.Where(c => c.Type == CipherType.Card)) - { - items.Add(new FilledItem(cipher)); - } - } - - return items; - } - - public static FillResponse BuildFillResponse(Context context, Parser parser, List items, bool locked) - { - var responseBuilder = new FillResponse.Builder(); - if(items != null && items.Count > 0) - { - foreach(var item in items) - { - var dataset = BuildDataset(context, parser.FieldCollection, item); - if(dataset != null) - { - responseBuilder.AddDataset(dataset); - } - } - } - - responseBuilder.AddDataset(BuildVaultDataset(context, parser.FieldCollection, parser.Uri, locked)); - AddSaveInfo(parser, responseBuilder, parser.FieldCollection); - responseBuilder.SetIgnoredIds(parser.FieldCollection.IgnoreAutofillIds.ToArray()); - return responseBuilder.Build(); - } - - public static Dataset BuildDataset(Context context, FieldCollection fields, FilledItem filledItem) - { - var datasetBuilder = new Dataset.Builder( - BuildListView(context.PackageName, filledItem.Name, filledItem.Subtitle, filledItem.Icon)); - if(filledItem.ApplyToFields(fields, datasetBuilder)) - { - return datasetBuilder.Build(); - } - return null; - } - - public static Dataset BuildVaultDataset(Context context, FieldCollection fields, string uri, bool locked) - { - var intent = new Intent(context, typeof(MainActivity)); - intent.PutExtra("autofillFramework", true); - if(fields.FillableForLogin) - { - intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Login); - } - else if(fields.FillableForCard) - { - intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Card); - } - else if(fields.FillableForIdentity) - { - intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Identity); - } - else - { - return null; - } - intent.PutExtra("autofillFrameworkUri", uri); - var pendingIntent = PendingIntent.GetActivity(context, ++_pendingIntentId, intent, - PendingIntentFlags.CancelCurrent); - - var view = BuildListView(context.PackageName, AppResources.AutofillWithBitwarden, - locked ? AppResources.VaultIsLocked : AppResources.GoToMyVault, Resource.Drawable.icon); - - var datasetBuilder = new Dataset.Builder(view); - datasetBuilder.SetAuthentication(pendingIntent.IntentSender); - - // Dataset must have a value set. We will reset this in the main activity when the real item is chosen. - foreach(var autofillId in fields.AutofillIds) - { - datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER")); - } - - return datasetBuilder.Build(); - } - - public static RemoteViews BuildListView(string packageName, string text, string subtext, int iconId) - { - var view = new RemoteViews(packageName, Resource.Layout.autofill_listitem); - view.SetTextViewText(Resource.Id.text, text); - view.SetTextViewText(Resource.Id.text2, subtext); - view.SetImageViewResource(Resource.Id.icon, iconId); - return view; - } - - public static void AddSaveInfo(Parser parser, FillResponse.Builder responseBuilder, FieldCollection fields) - { - // Docs state that password fields cannot be reliably saved in Compat mode since they will show as - // masked values. - var compatBrowser = CompatBrowsers.Contains(parser.PackageName); - if(compatBrowser && fields.SaveType == SaveDataType.Password) - { - return; - } - - var requiredIds = fields.GetRequiredSaveFields(); - if(fields.SaveType == SaveDataType.Generic || requiredIds.Length == 0) - { - return; - } - - var saveBuilder = new SaveInfo.Builder(fields.SaveType, requiredIds); - var optionalIds = fields.GetOptionalSaveIds(); - if(optionalIds.Length > 0) - { - saveBuilder.SetOptionalIds(optionalIds); - } - if(compatBrowser) - { - saveBuilder.SetFlags(SaveFlags.SaveOnAllViewsInvisible); - } - responseBuilder.SetSaveInfo(saveBuilder.Build()); - } - } -} \ No newline at end of file diff --git a/src/Android/Autofill/AutofillService.cs b/src/Android/Autofill/AutofillService.cs deleted file mode 100644 index cd0b05430..000000000 --- a/src/Android/Autofill/AutofillService.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Android; -using Android.App; -using Android.Content; -using Android.OS; -using Android.Runtime; -using Android.Service.Autofill; -using Android.Widget; -using Bit.App; -using Bit.App.Abstractions; -using Bit.App.Enums; -using System.Collections.Generic; -using System.Linq; -using XLabs.Ioc; - -namespace Bit.Android.Autofill -{ - [Service(Permission = Manifest.Permission.BindAutofillService, Label = "Bitwarden")] - [IntentFilter(new string[] { "android.service.autofill.AutofillService" })] - [MetaData("android.autofill", Resource = "@xml/autofillservice")] - [Register("com.x8bit.bitwarden.Autofill.AutofillService")] - public class AutofillService : global::Android.Service.Autofill.AutofillService - { - private ICipherService _cipherService; - private ILockService _lockService; - - public async override void OnFillRequest(FillRequest request, CancellationSignal cancellationSignal, FillCallback callback) - { - var structure = request.FillContexts?.LastOrDefault()?.Structure; - if(structure == null) - { - return; - } - - var parser = new Parser(structure); - parser.Parse(); - - if(!parser.ShouldAutofill) - { - return; - } - - if(_lockService == null) - { - _lockService = Resolver.Resolve(); - } - - List items = null; - var locked = (await _lockService.GetLockTypeAsync(false)) != LockType.None; - if(!locked) - { - if(_cipherService == null) - { - _cipherService = Resolver.Resolve(); - } - - items = await AutofillHelpers.GetFillItemsAsync(parser, _cipherService); - } - - // build response - var response = AutofillHelpers.BuildFillResponse(this, parser, items, locked); - callback.OnSuccess(response); - } - - public override void OnSaveRequest(SaveRequest request, SaveCallback callback) - { - var structure = request.FillContexts?.LastOrDefault()?.Structure; - if(structure == null) - { - return; - } - - var parser = new Parser(structure); - parser.Parse(); - - var savedItem = parser.FieldCollection.GetSavedItem(); - if(savedItem == null) - { - Toast.MakeText(this, "Unable to save this form.", ToastLength.Short).Show(); - return; - } - - var intent = new Intent(this, typeof(MainActivity)); - intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTop); - intent.PutExtra("autofillFramework", true); - intent.PutExtra("autofillFrameworkSave", true); - intent.PutExtra("autofillFrameworkType", (int)savedItem.Type); - switch(savedItem.Type) - { - case CipherType.Login: - intent.PutExtra("autofillFrameworkName", parser.Uri - .Replace(Constants.AndroidAppProtocol, string.Empty) - .Replace("https://", string.Empty) - .Replace("http://", string.Empty)); - intent.PutExtra("autofillFrameworkUri", parser.Uri); - intent.PutExtra("autofillFrameworkUsername", savedItem.Login.Username); - intent.PutExtra("autofillFrameworkPassword", savedItem.Login.Password); - break; - case CipherType.Card: - intent.PutExtra("autofillFrameworkCardName", savedItem.Card.Name); - intent.PutExtra("autofillFrameworkCardNumber", savedItem.Card.Number); - intent.PutExtra("autofillFrameworkCardExpMonth", savedItem.Card.ExpMonth); - intent.PutExtra("autofillFrameworkCardExpYear", savedItem.Card.ExpYear); - intent.PutExtra("autofillFrameworkCardCode", savedItem.Card.Code); - break; - default: - Toast.MakeText(this, "Unable to save this type of form.", ToastLength.Short).Show(); - return; - } - StartActivity(intent); - } - } -} diff --git a/src/Android/Autofill/Field.cs b/src/Android/Autofill/Field.cs deleted file mode 100644 index 36d18de20..000000000 --- a/src/Android/Autofill/Field.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Android.Service.Autofill; -using Android.Views; -using Android.Views.Autofill; -using static Android.App.Assist.AssistStructure; -using Android.Text; -using static Android.Views.ViewStructure; - -namespace Bit.Android.Autofill -{ - public class Field - { - private List _hints; - - public Field(ViewNode node) - { - Id = node.Id; - TrackingId = $"{node.Id}_{node.GetHashCode()}"; - IdEntry = node.IdEntry; - AutofillId = node.AutofillId; - AutofillType = node.AutofillType; - InputType = node.InputType; - Focused = node.IsFocused; - Selected = node.IsSelected; - Clickable = node.IsClickable; - Visible = node.Visibility == ViewStates.Visible; - Hints = FilterForSupportedHints(node.GetAutofillHints()); - Hint = node.Hint; - AutofillOptions = node.GetAutofillOptions()?.ToList(); - HtmlInfo = node.HtmlInfo; - Node = node; - - if(node.AutofillValue != null) - { - if(node.AutofillValue.IsList) - { - var autofillOptions = node.GetAutofillOptions(); - if(autofillOptions != null && autofillOptions.Length > 0) - { - ListValue = node.AutofillValue.ListValue; - TextValue = autofillOptions[node.AutofillValue.ListValue]; - } - } - else if(node.AutofillValue.IsDate) - { - DateValue = node.AutofillValue.DateValue; - } - else if(node.AutofillValue.IsText) - { - TextValue = node.AutofillValue.TextValue; - } - else if(node.AutofillValue.IsToggle) - { - ToggleValue = node.AutofillValue.ToggleValue; - } - } - } - - public SaveDataType SaveType { get; set; } = SaveDataType.Generic; - public List Hints - { - get => _hints; - set - { - _hints = value; - UpdateSaveTypeFromHints(); - } - } - public string Hint { get; set; } - public int Id { get; private set; } - public string TrackingId { get; private set; } - public string IdEntry { get; set; } - public AutofillId AutofillId { get; private set; } - public AutofillType AutofillType { get; private set; } - public InputTypes InputType { get; private set; } - public bool Focused { get; private set; } - public bool Selected { get; private set; } - public bool Clickable { get; private set; } - public bool Visible { get; private set; } - public List AutofillOptions { get; set; } - public string TextValue { get; set; } - public long? DateValue { get; set; } - public int? ListValue { get; set; } - public bool? ToggleValue { get; set; } - public HtmlInfo HtmlInfo { get; private set; } - public ViewNode Node { get; private set; } - - private void UpdateSaveTypeFromHints() - { - SaveType = SaveDataType.Generic; - if(_hints == null) - { - return; - } - - foreach(var hint in _hints) - { - switch(hint) - { - case View.AutofillHintCreditCardExpirationDate: - case View.AutofillHintCreditCardExpirationDay: - case View.AutofillHintCreditCardExpirationMonth: - case View.AutofillHintCreditCardExpirationYear: - case View.AutofillHintCreditCardNumber: - case View.AutofillHintCreditCardSecurityCode: - SaveType |= SaveDataType.CreditCard; - break; - case View.AutofillHintEmailAddress: - SaveType |= SaveDataType.EmailAddress; - break; - case View.AutofillHintPhone: - case View.AutofillHintName: - SaveType |= SaveDataType.Generic; - break; - case View.AutofillHintPassword: - SaveType |= SaveDataType.Password; - SaveType &= ~SaveDataType.EmailAddress; - SaveType &= ~SaveDataType.Username; - break; - case View.AutofillHintPostalAddress: - case View.AutofillHintPostalCode: - SaveType |= SaveDataType.Address; - break; - case View.AutofillHintUsername: - SaveType |= SaveDataType.Username; - break; - } - } - } - - public bool ValueIsNull() - { - return TextValue == null && DateValue == null && ToggleValue == null; - } - - public override bool Equals(object obj) - { - if(this == obj) - { - return true; - } - - if(obj == null || GetType() != obj.GetType()) - { - return false; - } - - var field = obj as Field; - if(TextValue != null ? !TextValue.Equals(field.TextValue) : field.TextValue != null) - { - return false; - } - - if(DateValue != null ? !DateValue.Equals(field.DateValue) : field.DateValue != null) - { - return false; - } - - return ToggleValue != null ? ToggleValue.Equals(field.ToggleValue) : field.ToggleValue == null; - } - - public override int GetHashCode() - { - var result = TextValue != null ? TextValue.GetHashCode() : 0; - result = 31 * result + (DateValue != null ? DateValue.GetHashCode() : 0); - result = 31 * result + (ToggleValue != null ? ToggleValue.GetHashCode() : 0); - return result; - } - - private static List FilterForSupportedHints(string[] hints) - { - return hints?.Where(h => IsValidHint(h)).ToList() ?? new List(); - } - - private static bool IsValidHint(string hint) - { - switch(hint) - { - case View.AutofillHintCreditCardExpirationDate: - case View.AutofillHintCreditCardExpirationDay: - case View.AutofillHintCreditCardExpirationMonth: - case View.AutofillHintCreditCardExpirationYear: - case View.AutofillHintCreditCardNumber: - case View.AutofillHintCreditCardSecurityCode: - case View.AutofillHintEmailAddress: - case View.AutofillHintPhone: - case View.AutofillHintName: - case View.AutofillHintPassword: - case View.AutofillHintPostalAddress: - case View.AutofillHintPostalCode: - case View.AutofillHintUsername: - return true; - default: - return false; - } - } - } -} diff --git a/src/Android/Autofill/FieldCollection.cs b/src/Android/Autofill/FieldCollection.cs deleted file mode 100644 index 05210073a..000000000 --- a/src/Android/Autofill/FieldCollection.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System.Collections.Generic; -using Android.Service.Autofill; -using Android.Views.Autofill; -using System.Linq; -using Android.Text; -using Android.Views; - -namespace Bit.Android.Autofill -{ - public class FieldCollection - { - private List _passwordFields = null; - private List _usernameFields = null; - private HashSet _ignoreSearchTerms = new HashSet { "search", "find", "recipient", "edit" }; - private HashSet _passwordTerms = new HashSet { "password", "pswd" }; - - public List AutofillIds { get; private set; } = new List(); - public SaveDataType SaveType - { - get - { - if(FillableForLogin) - { - return SaveDataType.Password; - } - else if(FillableForCard) - { - return SaveDataType.CreditCard; - } - - return SaveDataType.Generic; - } - } - public HashSet Hints { get; private set; } = new HashSet(); - public HashSet FocusedHints { get; private set; } = new HashSet(); - public HashSet FieldTrackingIds { get; private set; } = new HashSet(); - public List Fields { get; private set; } = new List(); - public IDictionary> HintToFieldsMap { get; private set; } = - new Dictionary>(); - public List IgnoreAutofillIds { get; private set; } = new List(); - - public List PasswordFields - { - get - { - if(_passwordFields != null) - { - return _passwordFields; - } - - if(Hints.Any()) - { - _passwordFields = new List(); - if(HintToFieldsMap.ContainsKey(View.AutofillHintPassword)) - { - _passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]); - } - } - else - { - _passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList(); - if(!_passwordFields.Any()) - { - _passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList(); - } - } - - return _passwordFields; - } - } - - public List UsernameFields - { - get - { - if(_usernameFields != null) - { - return _usernameFields; - } - - _usernameFields = new List(); - if(Hints.Any()) - { - if(HintToFieldsMap.ContainsKey(View.AutofillHintEmailAddress)) - { - _usernameFields.AddRange(HintToFieldsMap[View.AutofillHintEmailAddress]); - } - if(HintToFieldsMap.ContainsKey(View.AutofillHintUsername)) - { - _usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]); - } - } - else - { - foreach(var passwordField in PasswordFields) - { - var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId) - .LastOrDefault(); - if(usernameField != null) - { - _usernameFields.Add(usernameField); - } - } - } - - return _usernameFields; - } - } - - public bool FillableForLogin => FocusedHintsContain( - new string[] { View.AutofillHintUsername, View.AutofillHintEmailAddress, View.AutofillHintPassword }) || - UsernameFields.Any(f => f.Focused) || PasswordFields.Any(f => f.Focused); - public bool FillableForCard => FocusedHintsContain( - new string[] { View.AutofillHintCreditCardNumber, View.AutofillHintCreditCardExpirationMonth, - View.AutofillHintCreditCardExpirationYear, View.AutofillHintCreditCardSecurityCode}); - public bool FillableForIdentity => FocusedHintsContain( - new string[] { View.AutofillHintName, View.AutofillHintPhone, View.AutofillHintPostalAddress, - View.AutofillHintPostalCode }); - - public bool Fillable => FillableForLogin || FillableForCard || FillableForIdentity; - - public void Add(Field field) - { - if(field == null || FieldTrackingIds.Contains(field.TrackingId)) - { - return; - } - - _passwordFields = _usernameFields = null; - - FieldTrackingIds.Add(field.TrackingId); - Fields.Add(field); - AutofillIds.Add(field.AutofillId); - - if(field.Hints != null) - { - foreach(var hint in field.Hints) - { - Hints.Add(hint); - if(field.Focused) - { - FocusedHints.Add(hint); - } - - if(!HintToFieldsMap.ContainsKey(hint)) - { - HintToFieldsMap.Add(hint, new List()); - } - - HintToFieldsMap[hint].Add(field); - } - } - } - - public SavedItem GetSavedItem() - { - if(SaveType == SaveDataType.Password) - { - var passwordField = PasswordFields.FirstOrDefault(f => !string.IsNullOrWhiteSpace(f.TextValue)); - if(passwordField == null) - { - return null; - } - - var savedItem = new SavedItem - { - Type = App.Enums.CipherType.Login, - Login = new SavedItem.LoginItem - { - Password = GetFieldValue(passwordField) - } - }; - - var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId).LastOrDefault(); - savedItem.Login.Username = GetFieldValue(usernameField); - - return savedItem; - } - else if(SaveType == SaveDataType.CreditCard) - { - var savedItem = new SavedItem - { - Type = App.Enums.CipherType.Card, - Card = new SavedItem.CardItem - { - Number = GetFieldValue(View.AutofillHintCreditCardNumber), - Name = GetFieldValue(View.AutofillHintName), - ExpMonth = GetFieldValue(View.AutofillHintCreditCardExpirationMonth, true), - ExpYear = GetFieldValue(View.AutofillHintCreditCardExpirationYear), - Code = GetFieldValue(View.AutofillHintCreditCardSecurityCode) - } - }; - - return savedItem; - } - - return null; - } - - public AutofillId[] GetOptionalSaveIds() - { - if(SaveType == SaveDataType.Password) - { - return UsernameFields.Select(f => f.AutofillId).ToArray(); - } - else if(SaveType == SaveDataType.CreditCard) - { - var fieldList = new List(); - if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardSecurityCode)) - { - fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardSecurityCode]); - } - if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardExpirationYear)) - { - fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardExpirationYear]); - } - if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardExpirationMonth)) - { - fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardExpirationMonth]); - } - if(HintToFieldsMap.ContainsKey(View.AutofillHintName)) - { - fieldList.AddRange(HintToFieldsMap[View.AutofillHintName]); - } - return fieldList.Select(f => f.AutofillId).ToArray(); - } - - return new AutofillId[0]; - } - - public AutofillId[] GetRequiredSaveFields() - { - if(SaveType == SaveDataType.Password) - { - return PasswordFields.Select(f => f.AutofillId).ToArray(); - } - else if(SaveType == SaveDataType.CreditCard && HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardNumber)) - { - return HintToFieldsMap[View.AutofillHintCreditCardNumber].Select(f => f.AutofillId).ToArray(); - } - - return new AutofillId[0]; - } - - private bool FocusedHintsContain(IEnumerable hints) - { - return hints.Any(h => FocusedHints.Contains(h)); - } - - private string GetFieldValue(string hint, bool monthValue = false) - { - if(HintToFieldsMap.ContainsKey(hint)) - { - foreach(var field in HintToFieldsMap[hint]) - { - var val = GetFieldValue(field, monthValue); - if(!string.IsNullOrWhiteSpace(val)) - { - return val; - } - } - } - - return null; - } - - private string GetFieldValue(Field field, bool monthValue = false) - { - if(field == null) - { - return null; - } - - if(!string.IsNullOrWhiteSpace(field.TextValue)) - { - if(field.AutofillType == AutofillType.List && field.ListValue.HasValue && monthValue) - { - if(field.AutofillOptions.Count == 13) - { - return field.ListValue.ToString(); - } - else if(field.AutofillOptions.Count == 12) - { - return (field.ListValue + 1).ToString(); - } - } - return field.TextValue; - } - else if(field.DateValue.HasValue) - { - return field.DateValue.Value.ToString(); - } - else if(field.ToggleValue.HasValue) - { - return field.ToggleValue.Value.ToString(); - } - - return null; - } - - private bool FieldIsPassword(Field f) - { - var inputTypePassword = f.InputType.HasFlag(InputTypes.TextVariationPassword) || - f.InputType.HasFlag(InputTypes.TextVariationVisiblePassword) || - f.InputType.HasFlag(InputTypes.TextVariationWebPassword); - - // For whatever reason, multi-line input types are coming through with TextVariationPassword flags - if(inputTypePassword && f.InputType.HasFlag(InputTypes.TextVariationPassword) && - f.InputType.HasFlag(InputTypes.TextFlagMultiLine)) - { - inputTypePassword = false; - } - - if(!inputTypePassword && f.HtmlInfo != null && f.HtmlInfo.Tag == "input" && - (f.HtmlInfo.Attributes?.Any() ?? false)) - { - foreach(var a in f.HtmlInfo.Attributes) - { - var key = a.First as Java.Lang.String; - var val = a.Second as Java.Lang.String; - if(key != null && val != null && key.ToString() == "type" && val.ToString() == "password") - { - return true; - } - } - } - - return inputTypePassword && !ValueContainsAnyTerms(f.IdEntry, _ignoreSearchTerms) && - !ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms); - } - - private bool FieldHasPasswordTerms(Field f) - { - return ValueContainsAnyTerms(f.IdEntry, _passwordTerms) || ValueContainsAnyTerms(f.Hint, _passwordTerms); - } - - private bool ValueContainsAnyTerms(string value, HashSet terms) - { - if(string.IsNullOrWhiteSpace(value)) - { - return false; - } - - var lowerValue = value.ToLowerInvariant(); - return terms.Any(t => lowerValue.Contains(t)); - } - } -} \ No newline at end of file diff --git a/src/Android/Autofill/FilledItem.cs b/src/Android/Autofill/FilledItem.cs deleted file mode 100644 index 854b4531d..000000000 --- a/src/Android/Autofill/FilledItem.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System; -using Android.Service.Autofill; -using Android.Views.Autofill; -using System.Linq; -using Bit.App.Models; -using Bit.App.Enums; -using Android.Views; - -namespace Bit.Android.Autofill -{ - public class FilledItem - { - private Lazy _password; - private Lazy _cardName; - private string _cardNumber; - private Lazy _cardExpMonth; - private Lazy _cardExpYear; - private Lazy _cardCode; - private Lazy _idPhone; - private Lazy _idEmail; - private Lazy _idUsername; - private Lazy _idAddress; - private Lazy _idPostalCode; - - public FilledItem(Cipher cipher) - { - Name = cipher.Name?.Decrypt(cipher.OrganizationId) ?? "--"; - Type = cipher.Type; - - switch(Type) - { - case CipherType.Login: - Subtitle = cipher.Login.Username?.Decrypt(cipher.OrganizationId) ?? string.Empty; - Icon = Resource.Drawable.login; - _password = new Lazy(() => cipher.Login.Password?.Decrypt(cipher.OrganizationId)); - break; - case CipherType.Card: - Subtitle = cipher.Card.Brand?.Decrypt(cipher.OrganizationId); - _cardNumber = cipher.Card.Number?.Decrypt(cipher.OrganizationId); - if(!string.IsNullOrWhiteSpace(_cardNumber) && _cardNumber.Length >= 4) - { - if(!string.IsNullOrWhiteSpace(_cardNumber)) - { - Subtitle += ", "; - } - Subtitle += ("*" + _cardNumber.Substring(_cardNumber.Length - 4)); - } - Icon = Resource.Drawable.card; - _cardName = new Lazy(() => cipher.Card.CardholderName?.Decrypt(cipher.OrganizationId)); - _cardCode = new Lazy(() => cipher.Card.Code?.Decrypt(cipher.OrganizationId)); - _cardExpMonth = new Lazy(() => cipher.Card.ExpMonth?.Decrypt(cipher.OrganizationId)); - _cardExpYear = new Lazy(() => cipher.Card.ExpYear?.Decrypt(cipher.OrganizationId)); - break; - case CipherType.Identity: - var firstName = cipher.Identity?.FirstName?.Decrypt(cipher.OrganizationId) ?? " "; - var lastName = cipher.Identity?.LastName?.Decrypt(cipher.OrganizationId) ?? " "; - Subtitle = " "; - if(!string.IsNullOrWhiteSpace(firstName)) - { - Subtitle = firstName; - } - if(!string.IsNullOrWhiteSpace(lastName)) - { - if(!string.IsNullOrWhiteSpace(Subtitle)) - { - Subtitle += " "; - } - Subtitle += lastName; - } - Icon = Resource.Drawable.id; - _idPhone = new Lazy(() => cipher.Identity.Phone?.Decrypt(cipher.OrganizationId)); - _idEmail = new Lazy(() => cipher.Identity.Email?.Decrypt(cipher.OrganizationId)); - _idUsername = new Lazy(() => cipher.Identity.Username?.Decrypt(cipher.OrganizationId)); - _idAddress = new Lazy(() => - { - var address = cipher.Identity.Address1?.Decrypt(cipher.OrganizationId); - - var address2 = cipher.Identity.Address2?.Decrypt(cipher.OrganizationId); - if(!string.IsNullOrWhiteSpace(address2)) - { - if(!string.IsNullOrWhiteSpace(address)) - { - address += ", "; - } - - address += address2; - } - - var address3 = cipher.Identity.Address3?.Decrypt(cipher.OrganizationId); - if(!string.IsNullOrWhiteSpace(address3)) - { - if(!string.IsNullOrWhiteSpace(address)) - { - address += ", "; - } - - address += address3; - } - - return address; - }); - _idPostalCode = new Lazy(() => cipher.Identity.PostalCode?.Decrypt(cipher.OrganizationId)); - break; - default: - break; - } - } - - public string Name { get; set; } - public string Subtitle { get; set; } = string.Empty; - public int Icon { get; set; } = Resource.Drawable.login; - public CipherType Type { get; set; } - - public bool ApplyToFields(FieldCollection fieldCollection, Dataset.Builder datasetBuilder) - { - if(!fieldCollection?.Fields.Any() ?? true) - { - return false; - } - - var setValues = false; - if(Type == CipherType.Login) - { - if(fieldCollection.PasswordFields.Any() && !string.IsNullOrWhiteSpace(_password.Value)) - { - foreach(var f in fieldCollection.PasswordFields) - { - var val = ApplyValue(f, _password.Value); - if(val != null) - { - setValues = true; - datasetBuilder.SetValue(f.AutofillId, val); - } - } - } - - if(fieldCollection.UsernameFields.Any() && !string.IsNullOrWhiteSpace(Subtitle)) - { - foreach(var f in fieldCollection.UsernameFields) - { - var val = ApplyValue(f, Subtitle); - if(val != null) - { - setValues = true; - datasetBuilder.SetValue(f.AutofillId, val); - } - } - } - } - else if(Type == CipherType.Card) - { - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardNumber, - new Lazy(() => _cardNumber))) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardSecurityCode, _cardCode)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardExpirationMonth, _cardExpMonth, true)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardExpirationYear, _cardExpYear)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintName, _cardName)) - { - setValues = true; - } - } - else if(Type == CipherType.Identity) - { - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPhone, _idPhone)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintEmailAddress, _idEmail)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintUsername, _idUsername)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPostalAddress, _idAddress)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPostalCode, _idPostalCode)) - { - setValues = true; - } - if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintName, new Lazy(() => Subtitle))) - { - setValues = true; - } - } - - return setValues; - } - - private static bool ApplyValue(Dataset.Builder builder, FieldCollection fieldCollection, - string hint, Lazy value, bool monthValue = false) - { - bool setValues = false; - if(fieldCollection.HintToFieldsMap.ContainsKey(hint) && !string.IsNullOrWhiteSpace(value.Value)) - { - foreach(var f in fieldCollection.HintToFieldsMap[hint]) - { - var val = ApplyValue(f, value.Value, monthValue); - if(val != null) - { - setValues = true; - builder.SetValue(f.AutofillId, val); - } - } - } - return setValues; - } - - private static AutofillValue ApplyValue(Field field, string value, bool monthValue = false) - { - switch(field.AutofillType) - { - case AutofillType.Date: - if(long.TryParse(value, out long dateValue)) - { - return AutofillValue.ForDate(dateValue); - } - break; - case AutofillType.List: - if(field.AutofillOptions != null) - { - if(monthValue && int.TryParse(value, out int monthIndex)) - { - if(field.AutofillOptions.Count == 13) - { - return AutofillValue.ForList(monthIndex); - } - else if(field.AutofillOptions.Count >= monthIndex) - { - return AutofillValue.ForList(monthIndex - 1); - } - } - - for(var i = 0; i < field.AutofillOptions.Count; i++) - { - if(field.AutofillOptions[i].Equals(value)) - { - return AutofillValue.ForList(i); - } - } - } - break; - case AutofillType.Text: - return AutofillValue.ForText(value); - case AutofillType.Toggle: - if(bool.TryParse(value, out bool toggleValue)) - { - return AutofillValue.ForToggle(toggleValue); - } - break; - default: - break; - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/Android/Autofill/Parser.cs b/src/Android/Autofill/Parser.cs deleted file mode 100644 index 92d80c9b7..000000000 --- a/src/Android/Autofill/Parser.cs +++ /dev/null @@ -1,136 +0,0 @@ -using static Android.App.Assist.AssistStructure; -using Android.App.Assist; -using Bit.App; -using System.Collections.Generic; - -namespace Bit.Android.Autofill -{ - public class Parser - { - - public static HashSet ExcludedPackageIds = new HashSet - { - "android" - }; - - private readonly AssistStructure _structure; - private string _uri; - private string _packageName; - private string _webDomain; - - public Parser(AssistStructure structure) - { - _structure = structure; - } - - public FieldCollection FieldCollection { get; private set; } = new FieldCollection(); - public string Uri - { - get - { - if(!string.IsNullOrWhiteSpace(_uri)) - { - return _uri; - } - - if(string.IsNullOrWhiteSpace(WebDomain) && string.IsNullOrWhiteSpace(PackageName)) - { - _uri = null; - } - else if(!string.IsNullOrWhiteSpace(WebDomain)) - { - _uri = string.Concat("http://", WebDomain); - } - else - { - _uri = string.Concat(Constants.AndroidAppProtocol, PackageName); - } - - return _uri; - } - } - public string PackageName - { - get => _packageName; - set - { - if(string.IsNullOrWhiteSpace(value)) - { - _packageName = _uri = null; - } - - _packageName = value; - } - } - public string WebDomain - { - get => _webDomain; - set - { - if(string.IsNullOrWhiteSpace(value)) - { - _webDomain = _uri = null; - } - - _webDomain = value; - } - } - - public bool ShouldAutofill - { - get - { - return !string.IsNullOrWhiteSpace(Uri) && !AutofillHelpers.BlacklistedUris.Contains(Uri) && - FieldCollection != null && FieldCollection.Fillable; - } - } - - public void Parse() - { - for(var i = 0; i < _structure.WindowNodeCount; i++) - { - var node = _structure.GetWindowNodeAt(i); - ParseNode(node.RootViewNode); - } - - if(!AutofillHelpers.TrustedBrowsers.Contains(PackageName) && - !AutofillHelpers.CompatBrowsers.Contains(PackageName)) - { - WebDomain = null; - } - } - - private void ParseNode(ViewNode node) - { - SetPackageAndDomain(node); - var hints = node.GetAutofillHints(); - var isEditText = node.ClassName == "android.widget.EditText" || node?.HtmlInfo?.Tag == "input"; - if(isEditText || (hints?.Length ?? 0) > 0) - { - FieldCollection.Add(new Field(node)); - } - else - { - FieldCollection.IgnoreAutofillIds.Add(node.AutofillId); - } - - for(var i = 0; i < node.ChildCount; i++) - { - ParseNode(node.GetChildAt(i)); - } - } - - private void SetPackageAndDomain(ViewNode node) - { - if(string.IsNullOrWhiteSpace(PackageName) && !string.IsNullOrWhiteSpace(node.IdPackage) && - !ExcludedPackageIds.Contains(node.IdPackage)) - { - PackageName = node.IdPackage; - } - if(string.IsNullOrWhiteSpace(WebDomain) && !string.IsNullOrWhiteSpace(node.WebDomain)) - { - WebDomain = node.WebDomain; - } - } - } -} \ No newline at end of file diff --git a/src/Android/Autofill/SavedItem.cs b/src/Android/Autofill/SavedItem.cs deleted file mode 100644 index 280335199..000000000 --- a/src/Android/Autofill/SavedItem.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Bit.App.Enums; - -namespace Bit.Android.Autofill -{ - public class SavedItem - { - public CipherType Type { get; set; } - public LoginItem Login { get; set; } - public CardItem Card { get; set; } - - public class LoginItem - { - public string Username { get; set; } - public string Password { get; set; } - } - - public class CardItem - { - public string Name { get; set; } - public string Number { get; set; } - public string ExpMonth { get; set; } - public string ExpYear { get; set; } - public string Code { get; set; } - } - } -} \ No newline at end of file diff --git a/src/Android/AutofillActivity.cs b/src/Android/AutofillActivity.cs deleted file mode 100644 index fac004836..000000000 --- a/src/Android/AutofillActivity.cs +++ /dev/null @@ -1,110 +0,0 @@ -using Android.App; -using Android.Content; -using Android.OS; -using Android.Runtime; -using Android.Views; -using System; - -namespace Bit.Android -{ - [Activity(Theme = "@style/BitwardenTheme.Splash", WindowSoftInputMode = SoftInput.StateHidden)] - public class AutofillActivity : Activity - { - private DateTime? _lastLaunch = null; - private string _lastQueriedUri; - - public static AutofillCredentials LastCredentials { get; set; } - - protected override void OnCreate(Bundle bundle) - { - base.OnCreate(bundle); - LaunchMainActivity(Intent, 932473); - } - - protected override void OnNewIntent(Intent intent) - { - base.OnNewIntent(intent); - LaunchMainActivity(intent, 489729); - } - - protected override void OnDestroy() - { - base.OnDestroy(); - } - - protected override void OnResume() - { - base.OnResume(); - if(!Intent.HasExtra("uri")) - { - Finish(); - return; - } - - Intent.RemoveExtra("uri"); - } - - protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) - { - base.OnActivityResult(requestCode, resultCode, data); - if(data == null) - { - LastCredentials = null; - } - else - { - try - { - if(data.GetStringExtra("canceled") != null) - { - LastCredentials = null; - } - else - { - var uri = data.GetStringExtra("uri"); - var username = data.GetStringExtra("username"); - var password = data.GetStringExtra("password"); - - LastCredentials = new AutofillCredentials - { - Username = username, - Password = password, - Uri = uri, - LastUri = _lastQueriedUri - }; - } - } - catch - { - LastCredentials = null; - } - } - - Finish(); - } - - private void LaunchMainActivity(Intent callingIntent, int requestCode) - { - _lastQueriedUri = callingIntent?.GetStringExtra("uri"); - if(_lastQueriedUri == null) - { - Finish(); - return; - } - - var now = DateTime.UtcNow; - if(_lastLaunch.HasValue && (now - _lastLaunch.Value <= TimeSpan.FromSeconds(2))) - { - return; - } - - _lastLaunch = now; - var intent = new Intent(this, typeof(MainActivity)); - if(!callingIntent.Flags.HasFlag(ActivityFlags.LaunchedFromHistory)) - { - intent.PutExtra("uri", _lastQueriedUri); - } - StartActivityForResult(intent, requestCode); - } - } -} diff --git a/src/Android/AutofillCredentials.cs b/src/Android/AutofillCredentials.cs deleted file mode 100644 index 8ee4647ac..000000000 --- a/src/Android/AutofillCredentials.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Bit.Android -{ - public class AutofillCredentials - { - public string Username { get; set; } - public string Password { get; set; } - public string Uri { get; set; } - public string LastUri { get; set; } - } -} diff --git a/src/Android/AutofillService.cs b/src/Android/AutofillService.cs deleted file mode 100644 index 9ffc31625..000000000 --- a/src/Android/AutofillService.cs +++ /dev/null @@ -1,546 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Android.AccessibilityServices; -using Android.App; -using Android.Content; -using Android.OS; -using Android.Views.Accessibility; -using Bit.App.Abstractions; -using XLabs.Ioc; -using Bit.App.Resources; - -namespace Bit.Android -{ - [Service(Permission = global::Android.Manifest.Permission.BindAccessibilityService, Label = "Bitwarden")] - [IntentFilter(new string[] { "android.accessibilityservice.AccessibilityService" })] - [MetaData("android.accessibilityservice", Resource = "@xml/accessibilityservice")] - public class AutofillService : AccessibilityService - { - private NotificationChannel _notificationChannel; - - private const string BitwardenTag = "bw_access"; - private const int AutoFillNotificationId = 34573; - private const string SystemUiPackage = "com.android.systemui"; - private const string BitwardenPackage = "com.x8bit.bitwarden"; - private const string BitwardenWebsite = "vault.bitwarden.com"; - - private static Dictionary SupportedBrowsers => new List - { - new Browser("com.android.chrome", "url_bar"), - new Browser("com.chrome.beta", "url_bar"), - new Browser("org.chromium.chrome", "url_bar"), - new Browser("com.android.browser", "url"), - new Browser("com.brave.browser", "url_bar"), - new Browser("com.opera.browser", "url_field"), - new Browser("com.opera.browser.beta", "url_field"), - new Browser("com.opera.mini.native", "url_field"), - new Browser("com.opera.touch", "addressbarEdit"), - new Browser("com.chrome.dev", "url_bar"), - new Browser("com.chrome.canary", "url_bar"), - new Browser("com.google.android.apps.chrome", "url_bar"), - new Browser("com.google.android.apps.chrome_dev", "url_bar"), - new Browser("org.codeaurora.swe.browser", "url_bar"), - new Browser("org.iron.srware", "url_bar"), - new Browser("com.sec.android.app.sbrowser", "location_bar_edit_text"), - new Browser("com.sec.android.app.sbrowser.beta", "location_bar_edit_text"), - new Browser("com.yandex.browser", "bro_omnibar_address_title_text", - (s) => s.Split(new char[]{' ', ''}).FirstOrDefault()), // 0 = Regular Space, 1 = No-break space (00A0) - new Browser("org.mozilla.firefox", "url_bar_title"), - new Browser("org.mozilla.firefox_beta", "url_bar_title"), - new Browser("org.mozilla.fennec_aurora", "url_bar_title"), - new Browser("org.mozilla.focus", "display_url"), - new Browser("org.mozilla.klar", "display_url"), - new Browser("com.ghostery.android.ghostery", "search_field"), - new Browser("org.adblockplus.browser", "url_bar_title"), - new Browser("com.htc.sense.browser", "title"), - new Browser("com.amazon.cloud9", "url"), - new Browser("mobi.mgeek.TunnyBrowser", "title"), - new Browser("com.nubelacorp.javelin", "enterUrl"), - new Browser("com.jerky.browser2", "enterUrl"), - new Browser("com.mx.browser", "address_editor_with_progress"), - new Browser("com.mx.browser.tablet", "address_editor_with_progress"), - new Browser("com.linkbubble.playstore", "url_text"), - new Browser("com.ksmobile.cb", "address_bar_edit_text"), - new Browser("acr.browser.lightning", "search"), - new Browser("acr.browser.barebones", "search"), - new Browser("com.microsoft.emmx", "url_bar"), - new Browser("com.duckduckgo.mobile.android", "omnibarTextInput"), - new Browser("mark.via.gp", "aw"), - new Browser("org.bromite.bromite", "url_bar"), - new Browser("com.kiwibrowser.browser", "url_bar"), - new Browser("com.ecosia.android", "url_bar"), - new Browser("com.qwant.liberty", "url_bar_title"), - }.ToDictionary(n => n.PackageName); - - // Known packages to skip - private static HashSet FilteredPackageNames => new HashSet - { - SystemUiPackage, - "com.google.android.googlequicksearchbox", - "com.google.android.apps.nexuslauncher", - "com.google.android.launcher", - "com.computer.desktop.ui.launcher", - "com.launcher.notelauncher", - "com.anddoes.launcher", - "com.actionlauncher.playstore", - "ch.deletescape.lawnchair.plah", - "com.microsoft.launcher", - "com.teslacoilsw.launcher", - "com.teslacoilsw.launcher.prime", - "is.shortcut", - "me.craftsapp.nlauncher", - "com.ss.squarehome2" - }; - - private readonly IAppSettingsService _appSettings; - private long _lastNotificationTime = 0; - private string _lastNotificationUri = null; - private HashSet _launcherPackageNames = null; - private DateTime? _lastLauncherSetBuilt = null; - private TimeSpan _rebuildLauncherSpan = TimeSpan.FromHours(1); - - public AutofillService() - { - _appSettings = Resolver.Resolve(); - } - - public override void OnAccessibilityEvent(AccessibilityEvent e) - { - try - { - var powerManager = (PowerManager)GetSystemService(PowerService); - if(Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch && !powerManager.IsInteractive) - { - return; - } - else if(Build.VERSION.SdkInt < BuildVersionCodes.Lollipop && !powerManager.IsScreenOn) - { - return; - } - - if(SkipPackage(e?.PackageName)) - { - return; - } - - var root = RootInActiveWindow; - if(root == null || root.PackageName != e.PackageName) - { - return; - } - - // var testNodes = GetWindowNodes(root, e, n => n.ViewIdResourceName != null && n.Text != null, false); - // var testNodesData = testNodes.Select(n => new { id = n.ViewIdResourceName, text = n.Text }); - - var notificationManager = (NotificationManager)GetSystemService(NotificationService); - var cancelNotification = true; - - switch(e.EventType) - { - case EventTypes.ViewFocused: - if(e.Source == null || !e.Source.Password || !_appSettings.AutofillPasswordField) - { - break; - } - - if(e.PackageName == BitwardenPackage) - { - CancelNotification(notificationManager); - break; - } - - if(ScanAndAutofill(root, e, notificationManager, cancelNotification)) - { - CancelNotification(notificationManager); - } - break; - case EventTypes.WindowContentChanged: - case EventTypes.WindowStateChanged: - if(_appSettings.AutofillPasswordField && e.Source.Password) - { - break; - } - else if(_appSettings.AutofillPasswordField && AutofillActivity.LastCredentials == null) - { - if(string.IsNullOrWhiteSpace(_lastNotificationUri)) - { - CancelNotification(notificationManager); - break; - } - - var uri = GetUri(root); - if(uri != _lastNotificationUri) - { - CancelNotification(notificationManager); - } - else if(uri.StartsWith(App.Constants.AndroidAppProtocol)) - { - CancelNotification(notificationManager, 30000); - } - - break; - } - - if(e.PackageName == BitwardenPackage) - { - CancelNotification(notificationManager); - break; - } - - if(_appSettings.AutofillPersistNotification) - { - var uri = GetUri(root); - if(uri != null && !uri.Contains(BitwardenWebsite)) - { - var needToFill = NeedToAutofill(AutofillActivity.LastCredentials, uri); - if(needToFill) - { - var passwordNodes = GetWindowNodes(root, e, n => n.Password, false); - needToFill = passwordNodes.Any(); - if(needToFill) - { - var allEditTexts = GetWindowNodes(root, e, n => EditText(n), false); - var usernameEditText = allEditTexts.TakeWhile(n => !n.Password).LastOrDefault(); - FillCredentials(usernameEditText, passwordNodes); - - allEditTexts.Dispose(); - usernameEditText.Dispose(); - } - passwordNodes.Dispose(); - } - - if(!needToFill) - { - NotifyToAutofill(uri, notificationManager); - cancelNotification = false; - } - } - - AutofillActivity.LastCredentials = null; - } - else - { - cancelNotification = ScanAndAutofill(root, e, notificationManager, cancelNotification); - } - - if(cancelNotification) - { - CancelNotification(notificationManager); - } - break; - default: - break; - } - - notificationManager?.Dispose(); - root.Dispose(); - e.Dispose(); - } - // Suppress exceptions so that service doesn't crash - catch { } - } - - public override void OnInterrupt() - { - - } - - public bool ScanAndAutofill(AccessibilityNodeInfo root, AccessibilityEvent e, - NotificationManager notificationManager, bool cancelNotification) - { - var passwordNodes = GetWindowNodes(root, e, n => n.Password, false); - if(passwordNodes.Count > 0) - { - var uri = GetUri(root); - if(uri != null && !uri.Contains(BitwardenWebsite)) - { - if(NeedToAutofill(AutofillActivity.LastCredentials, uri)) - { - var allEditTexts = GetWindowNodes(root, e, n => EditText(n), false); - var usernameEditText = allEditTexts.TakeWhile(n => !n.Password).LastOrDefault(); - FillCredentials(usernameEditText, passwordNodes); - - allEditTexts.Dispose(); - usernameEditText.Dispose(); - } - else - { - NotifyToAutofill(uri, notificationManager); - cancelNotification = false; - } - } - - AutofillActivity.LastCredentials = null; - } - else if(AutofillActivity.LastCredentials != null) - { - System.Threading.Tasks.Task.Run(async () => - { - await System.Threading.Tasks.Task.Delay(1000); - AutofillActivity.LastCredentials = null; - }); - } - - passwordNodes.Dispose(); - return cancelNotification; - } - - public void CancelNotification(NotificationManager notificationManager, long limit = 250) - { - if(Java.Lang.JavaSystem.CurrentTimeMillis() - _lastNotificationTime < limit) - { - return; - } - - _lastNotificationUri = null; - notificationManager?.Cancel(AutoFillNotificationId); - } - - private string GetUri(AccessibilityNodeInfo root) - { - var uri = string.Concat(App.Constants.AndroidAppProtocol, root.PackageName); - if(SupportedBrowsers.ContainsKey(root.PackageName)) - { - var addressNode = root.FindAccessibilityNodeInfosByViewId( - $"{root.PackageName}:id/{SupportedBrowsers[root.PackageName].UriViewId}").FirstOrDefault(); - if(addressNode != null) - { - uri = ExtractUri(uri, addressNode, SupportedBrowsers[root.PackageName]); - addressNode.Dispose(); - } - } - - return uri; - } - - private string ExtractUri(string uri, AccessibilityNodeInfo addressNode, Browser browser) - { - if(addressNode?.Text != null) - { - uri = browser.GetUriFunction(addressNode.Text)?.Trim(); - if(uri != null && uri.Contains(".")) - { - if(!uri.Contains("://") && !uri.Contains(" ")) - { - uri = string.Concat("http://", uri); - } - else if(Build.VERSION.SdkInt <= BuildVersionCodes.KitkatWatch) - { - var parts = uri.Split(new string[] { ". " }, StringSplitOptions.None); - if(parts.Length > 1) - { - var urlPart = parts.FirstOrDefault(p => p.StartsWith("http")); - if(urlPart != null) - { - uri = urlPart.Trim(); - } - } - } - } - } - - return uri; - } - - /// - /// Check to make sure it is ok to autofill still on the current screen - /// - private bool NeedToAutofill(AutofillCredentials creds, string currentUriString) - { - if(creds == null) - { - return false; - } - - Uri lastUri, currentUri; - if(Uri.TryCreate(creds.LastUri, UriKind.Absolute, out lastUri) && - Uri.TryCreate(currentUriString, UriKind.Absolute, out currentUri) && - lastUri.Host == currentUri.Host) - { - return true; - } - - return false; - } - - private static bool EditText(AccessibilityNodeInfo n) - { - return n?.ClassName?.Contains("EditText") ?? false; - } - - private void NotifyToAutofill(string uri, NotificationManager notificationManager) - { - if(notificationManager == null || string.IsNullOrWhiteSpace(uri)) - { - return; - } - - var now = Java.Lang.JavaSystem.CurrentTimeMillis(); - var intent = new Intent(this, typeof(AutofillActivity)); - intent.PutExtra("uri", uri); - intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop); - var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent); - - var notificationContent = Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch ? - AppResources.BitwardenAutofillServiceNotificationContent : - AppResources.BitwardenAutofillServiceNotificationContentOld; - - var builder = new Notification.Builder(this); - builder.SetSmallIcon(Resource.Drawable.notification_sm) - .SetContentTitle(AppResources.BitwardenAutofillService) - .SetContentText(notificationContent) - .SetTicker(notificationContent) - .SetWhen(now) - .SetContentIntent(pendingIntent); - - if(Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch) - { - builder.SetVisibility(NotificationVisibility.Secret) - .SetColor(global::Android.Support.V4.Content.ContextCompat.GetColor(ApplicationContext, - Resource.Color.primary)); - } - - if(Build.VERSION.SdkInt >= BuildVersionCodes.O) - { - if(_notificationChannel == null) - { - _notificationChannel = new NotificationChannel("bitwarden_autofill_service", - AppResources.AutofillService, NotificationImportance.Low); - notificationManager.CreateNotificationChannel(_notificationChannel); - } - builder.SetChannelId(_notificationChannel.Id); - } - - if(/*Build.VERSION.SdkInt <= BuildVersionCodes.N && */_appSettings.AutofillPersistNotification) - { - builder.SetPriority(-2); - } - - _lastNotificationTime = now; - _lastNotificationUri = uri; - notificationManager.Notify(AutoFillNotificationId, builder.Build()); - - builder.Dispose(); - } - - private void FillCredentials(AccessibilityNodeInfo usernameNode, IEnumerable passwordNodes) - { - FillEditText(usernameNode, AutofillActivity.LastCredentials?.Username); - foreach(var n in passwordNodes) - { - FillEditText(n, AutofillActivity.LastCredentials?.Password); - } - } - - private static void FillEditText(AccessibilityNodeInfo editTextNode, string value) - { - if(editTextNode == null || value == null) - { - return; - } - - var bundle = new Bundle(); - bundle.PutString(AccessibilityNodeInfo.ActionArgumentSetTextCharsequence, value); - editTextNode.PerformAction(global::Android.Views.Accessibility.Action.SetText, bundle); - } - - private NodeList GetWindowNodes(AccessibilityNodeInfo n, AccessibilityEvent e, - Func condition, bool disposeIfUnused, NodeList nodes = null, - int recursionDepth = 0) - { - if(nodes == null) - { - nodes = new NodeList(); - } - - var dispose = disposeIfUnused; - if(n != null && recursionDepth < 50) - { - if(n.WindowId == e.WindowId && !(n.ViewIdResourceName?.StartsWith(SystemUiPackage) ?? false) && condition(n)) - { - dispose = false; - nodes.Add(n); - } - - for(var i = 0; i < n.ChildCount; i++) - { - var childNode = n.GetChild(i); - if(i > 100) - { - global::Android.Util.Log.Info(BitwardenTag, "Too many child iterations."); - break; - } - else if(childNode.GetHashCode() == n.GetHashCode()) - { - global::Android.Util.Log.Info(BitwardenTag, - "Child node is the same as parent for some reason."); - } - else - { - GetWindowNodes(childNode, e, condition, true, nodes, recursionDepth++); - } - } - } - - if(dispose) - { - n?.Dispose(); - } - - return nodes; - } - - private bool SkipPackage(string eventPackageName) - { - if(string.IsNullOrWhiteSpace(eventPackageName) || FilteredPackageNames.Contains(eventPackageName) - || eventPackageName.Contains("launcher")) - { - return true; - } - - if(_launcherPackageNames == null || _lastLauncherSetBuilt == null || - (DateTime.Now - _lastLauncherSetBuilt.Value) > _rebuildLauncherSpan) - { - // refresh launcher list every now and then - _lastLauncherSetBuilt = DateTime.Now; - var intent = new Intent(Intent.ActionMain); - intent.AddCategory(Intent.CategoryHome); - var resolveInfo = PackageManager.QueryIntentActivities(intent, 0); - _launcherPackageNames = resolveInfo.Select(ri => ri.ActivityInfo.PackageName).ToHashSet(); - } - - return _launcherPackageNames.Contains(eventPackageName); - } - - public class Browser - { - public Browser(string packageName, string uriViewId) - { - PackageName = packageName; - UriViewId = uriViewId; - } - - public Browser(string packageName, string uriViewId, Func getUriFunction) - : this(packageName, uriViewId) - { - GetUriFunction = getUriFunction; - } - - public string PackageName { get; set; } - public string UriViewId { get; set; } - public Func GetUriFunction { get; set; } = (s) => s; - } - - public class NodeList : List, IDisposable - { - public void Dispose() - { - foreach(var item in this) - { - item.Dispose(); - } - } - } - } -} diff --git a/src/Android/Controls/CustomButtonRenderer.cs b/src/Android/Controls/CustomButtonRenderer.cs deleted file mode 100644 index 18b681662..000000000 --- a/src/Android/Controls/CustomButtonRenderer.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.ComponentModel; -using Android.Content; -using Bit.Android.Controls; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; - -[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))] -namespace Bit.Android.Controls -{ - public class CustomButtonRenderer : ButtonRenderer - { - public CustomButtonRenderer(Context context) - : base(context) - { } - - protected override void OnElementChanged(ElementChangedEventArgs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/iOS.Autofill/Models/Context.cs b/src/iOS.Autofill/Models/Context.cs deleted file mode 100644 index c4a6ccf2b..000000000 --- a/src/iOS.Autofill/Models/Context.cs +++ /dev/null @@ -1,14 +0,0 @@ -using AuthenticationServices; -using Bit.iOS.Core.Models; -using Foundation; - -namespace Bit.iOS.Autofill.Models -{ - public class Context : AppExtensionContext - { - public NSExtensionContext ExtContext { get; set; } - public ASCredentialServiceIdentifier[] ServiceIdentifiers { get; set; } - public ASPasswordCredentialIdentity CredentialIdentity { get; set; } - public bool Configuring { get; set; } - } -} diff --git a/src/iOS.Autofill/PasswordGeneratorViewController.cs b/src/iOS.Autofill/PasswordGeneratorViewController.cs deleted file mode 100644 index 402cef12b..000000000 --- a/src/iOS.Autofill/PasswordGeneratorViewController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Autofill -{ - public partial class PasswordGeneratorViewController : Core.Controllers.PasswordGeneratorViewController - { - public PasswordGeneratorViewController(IntPtr handle) : base(handle, true) - { } - - public LoginAddViewController Parent { get; set; } - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelBarButton; - public override UIBarButtonItem BaseSelectBarButton => SelectBarButton; - public override UILabel BasePasswordLabel => PasswordLabel; - - partial void SelectBarButton_Activated(UIBarButtonItem sender) - { - GoogleAnalyticsService.TrackAutofillExtensionEvent("SelectedGeneratedPassword"); - DismissViewController(true, () => - { - Parent.PasswordCell.TextField.Text = PasswordLabel.Text; - }); - } - - partial void CancelBarButton_Activated(UIBarButtonItem sender) - { - DismissViewController(true, null); - } - } -} diff --git a/src/iOS.Autofill/PasswordGeneratorViewController.designer.cs b/src/iOS.Autofill/PasswordGeneratorViewController.designer.cs deleted file mode 100644 index cff6e5a65..000000000 --- a/src/iOS.Autofill/PasswordGeneratorViewController.designer.cs +++ /dev/null @@ -1,82 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Visual Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Autofill -{ - [Register ("PasswordGeneratorViewController")] - partial class PasswordGeneratorViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIView BaseView { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelBarButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIView OptionsContainer { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel PasswordLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem SelectBarButton { get; set; } - - [Action ("CancelBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelBarButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("SelectBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void SelectBarButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (BaseView != null) { - BaseView.Dispose (); - BaseView = null; - } - - if (CancelBarButton != null) { - CancelBarButton.Dispose (); - CancelBarButton = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (OptionsContainer != null) { - OptionsContainer.Dispose (); - OptionsContainer = null; - } - - if (PasswordLabel != null) { - PasswordLabel.Dispose (); - PasswordLabel = null; - } - - if (SelectBarButton != null) { - SelectBarButton.Dispose (); - SelectBarButton = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Autofill/Properties/AssemblyInfo.cs b/src/iOS.Autofill/Properties/AssemblyInfo.cs deleted file mode 100644 index a4f6227ac..000000000 --- a/src/iOS.Autofill/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BitwardeniOSAutofill")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("8bit Solutions LLC")] -[assembly: AssemblyProduct("Bitwarden")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("32f5a2d6-f54d-4da1-ae26-0a980d48f421")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/iOS.Autofill/Resources/Icon.png b/src/iOS.Autofill/Resources/Icon.png deleted file mode 100644 index e4b594ad570d200ba1adf9feac9fca7dc3faf1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*Fy#+W|fyu0Yy&m;w&>@G7A9JW7K6 zf*BZ@m|0laIJkNF_yvVUM8zfK6%>`!H1&*(Eo_{eeZmscvkQuA8k(9r`e)2twRXd% zU5AgJI(Pp1&0F^#J$w23?fcJPzyJLGcje{(-+^Y{_jGX#u{izq%5}ab1BteW@{C9K ze!o}!e(%=r^{&fWy+XOz)#QH8y)fN|vk@5LLDebSa(TAQv~EcgiL%)8Q|evVFP}uF zFMl7(|C5@h`=IIA6n@n^wNbKmJrCAhKJ_V4x_r{KL#=U_K5gDDqv2Cv_LZH*a)axo zvo$Skifblm8S@?asxC51<(ZjS)AK)kZ<&kiG(PP5@KyBK)%ZJ_4DY#PB{Z&HxqOj- z{^wjxpXYtA5?`_`wse!)lX-m}&oN=IH@ok1ADEy2r^H!&hF-l=&V0tzC#Op95^?oz f&kQlz@tZ+o`{Q$G{_ULs^eTg=tDnm{r-UW|fe_5o diff --git a/src/iOS.Autofill/Resources/Icon@2x.png b/src/iOS.Autofill/Resources/Icon@2x.png deleted file mode 100644 index 37369f4d30a92c10d97f58da0390d8b205af2cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPVEzz{nlo6XFWw8jk{S2>e<1#0(f5 z5hX!>!3>N{%q*;I>>Qk2+&ui^QZfpPO3G>)S~`0AMy6)w)=th|e*R$*k=Z%9rRCKP z9i81hlcr3aK5xOI#YzSpZh>M8NOZ00H1 z|4H^)>b#Q%Jkkg5Z_@RBKJQu-OHQQigG&-OxVY{mEf5pAVi3S@!}!nMBBbLnyQ;#w z;07j<1q`ej4vbs@4NOZIL;XHfUviIl@wxHDi~NY4&zaME>)NMk$?r({!WH(Z=0W4d z&k>%*jV}&=eV#jmJI1V9BH!F5;rIz&_uEexuAklWuwx;ku|$>WD}^U#SkpEnU1NIq zPjIT>9izoo&Q)#RIS-niGPNHO&kRXq6pl{|Ui75APlj2ddfOJ69cw&!kHzb(eEH1L zX(`L|`?{{aJDN7Qv8T0N+r%ZOeW}5ETL8oPxj&m;94U+Y`i;S~#^L3`vO5kB)Z?m~ zZY$r;yn9``yR^K3Z})%ER&z1^y9Z)_fBnL(mA@xhX~q$I$^M3_-+l#4+vdMvJp5$g z{q!Cs=F3ae^WO(D9b33*dbryGyPIEs`^B@ZbM-qJr^>YF^p`m?`pk@NT{q zIC_39ecpQz?dE26XFWw8jk|Hgg{V`SqCT% zN`m}?85o(ESyh*MS49U3n_U7$yp+J%2A8U_D zuk1}&vh?QPq{N7>)bD3ZHk&AQUs@L;#j3(JG`{C6Y3F67Ad;G3I>N3vL+7ALcPW^P%o*QHHPb z2U(7_XAD3B*opt#cgz^-OJy@2FW$xYWBO|cQTbYPhTZj(f3)@6T{wLA9rOE-SGlVy zj?^YF$KPGhzWE(9YJ454XSjn|(8{ zO~SAGo8?UdPoDg$Z=NrUx<%x^p1FT=dAP?z{dqrAf0`r;AG&UnZ7pc9&!3&YYTn^< zdk>gO>ey9ZZ*KfQpGox35oS*PY@9y~7n?_tvr(Bg|{;GGh>9>8->TZFhKP5h#w9T2)o}ugBmcMxR zae=K{Gd?K(+4fS?C107VMs$C9WV^*$&BK3H+uyurWvE!f@m%W1SJ#f)OHW~n_O94J1u0Y!Ki1~0rxfaH=fWC4q z3GxeOU}R!pW#{1Js5L9=M?AGQl{}sGNzwV=hEr!ND*wGdvGnZf+jBE{E8hw;YJ z-v_wxOPw`qB^lTr))|cfM)+swp21YM~r>mdKI;Vst0NZR%cmMzZ diff --git a/src/iOS.Autofill/Resources/check@2x.png b/src/iOS.Autofill/Resources/check@2x.png deleted file mode 100644 index 9efd035c61c6651e2f46715561fd01eaaf484092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1233 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD8Ax&oe*=IRzF>ChRMa$N%->`GvfrBT`U%q+PM);9y6A)`$B%RP-9Ublz!eXuMmoplSDxCP9vapa0jl$8X^Y z^LTgWi%)s<-#Wi%c2jpvU8N$^VRQa73?=8U2)xM@K0WLk!{h%PeVM z^Sft0cck<;?vG|W%XY=~%&V)mXHQ*apV4@m?QGZ8t5ONRcdxGru|2?}BW0o;627{@ zv{ZMqQK|1{tB~JDaq=gIOIv;M`i)#Luwz4=`ncE;H|mcRbCL89Ex9q&1%AB&xd|6l3#yT#VH zIqCq%dPfq_$W9Hk78=t9G7H^1Z zmAoOPn>O#c5p(qMw=xtg5P{(U(r2d^$YGAd!y>r8?lRhQ8lF!EkoXyZ%mS!p* zWIVfj#m%#JBCp;&BY8FQzg69$R;cwJ9mQD-n-+Rd%&k;)z;Ps!22WQ%mvv4F FO#oFPEOY<> diff --git a/src/iOS.Autofill/Resources/check@3x.png b/src/iOS.Autofill/Resources/check@3x.png deleted file mode 100644 index 0e95759b430f045a9b122159c3453df7de8999bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmeH{`#aMM0LCXB6MbDu7hm~0TH#1#43En~V;i|WD2ZH-V#{&q!ZsttY{-mq;*rkT z%w0!~B=?h{6*BiILM}@=%w>zDorGG3hyVbZx?8x2%lADvK{T7qqT_h(m{UboGAHKVoq7*l|Ooh2;qh7U$&b?s>-7FYxD} z3&9}-V(2en5s{a#UW+1;Db(2O@i!6@ljzAQx6;yCnYZ&FRo6B&{mE|=boUGly`7v9 zefT)PAYNXTu6_CX`NUu0Fxd9j4tBPlj&OlJ8Ef5<2_#~zVrw+tHK8{4fvR*l-gWEvYVRb2?bkJo&d>mBmme{U?0|%Qb zY!KecDEFfY*ve2LUQ(_KzIcK`46C4SqgBg!;%qALMH4J#b8ZC5W?}*G#TdT-tZQMQ zmJMQ9hHxm9j?K>&;-7frwp%zdXNCC99^Q5^MWWbu_EcGqEYoh5MtpEn4#m#2f3J&T z%K!u$F1g(N63X;+dDm4o()(h^s&ag@_Ei!IGX?%y;aa-jrn$U^lM}8m*se)d%B%>&B{=6e|M=A3mScFA( zWq2|bx~vk7OwzP-2{uJ^&icT+o=)*lNWp(gQ{NdZ1 zUUON7z+CsUO|roruI>C~_Z+$E=Q{$yehATmDnSL6Z0G)`g5{MV8O0lVohmB|>tBo*ZejL>%m%d%OS)<}9_4Amt?G68% z#P}7Y9sNwaDqp3}D#w+eZ(5;S!kni>s#h3?tXYpVOlm2#vEwg05F1ZUyFdq`yO+e{ zyp-%)@a)Fcu-(G(nP@3Wly}p^xpSffhxoG zxRQ)$e~o%zEEPRPbc@0FvzIeUZKt(QC$?iMy;!DL3MSj%w=NB^M01{+@ z@}&@ZBHwdx{3M1Ba|xCJLnxoHe6a}u&JNsS>4=*@7vxXFxQ<_1(}vJ^uY z63lY^5iHzJa2P!)6wImK!kV(ks7i8c0kR(F3szBDi;z{gSkRc#T7vw5>}vW$dw0kw z>!Ci8DbI94td{mrQ)f~Vix2Fl&*qerf4aW1uq}tjT?WcLNt#x%goWH%w#|3v^Dj=X Z1GtNjs=l&i*4Ed;9PC}}DozF@{0$aLKnnl> diff --git a/src/iOS.Autofill/Resources/fingerprint.png b/src/iOS.Autofill/Resources/fingerprint.png deleted file mode 100644 index 754e39825fd8395825478c1fe525130fee203235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3956 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 Rp0oe}002ovPDHLkV1f{CJm~-c diff --git a/src/iOS.Autofill/Resources/logo.png b/src/iOS.Autofill/Resources/logo.png deleted file mode 100644 index 33ced5b12e05df53eb268ec0870e26b07af9ee6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2593 zcmV++3f}dJP)e6IhGCzS&zeeRdw6)F=`gnN z@2ZzB7n2;X*r2Sn#zSf%neE}>iKgQaPd4A6H!>!l?T~~_ycr*cd3d7nC?uPEylml< z#vbnuJ{jCC1W=sk@$m2-O%J>c9fl-S$)Mdlh$k5jPc%IT-3AaIuiKo7EeJ^@Zto09 zM-bM!;QIv>Z$%JoSr&Z1E+ESk`v2td5IwptpDWpw_=OBI);bpRQU;xF(Z462XDr8IwuG0U+|5sr5i2F}0 zM-c8ei||j@KZE>4xRmpV>B((zEDi>3S)vS7IZROIL4i@=Y6h2G{e4b&y{F|Vn2b|R)9I)H>;^la!{*8hE`>W6Y9=Fi35jF zjw)hYAlJ2~-I-#E11v8VCA8OvC`Mlp&*yMwb$enT3JuQaI(<0*iV>EaS$Il&ROYJXfL- z-pOAmJaK(xDqmECSF<4PSQz|Py%sq{YU+{Gjx9p&^ZxJR$>h} zia6>~e`CWu4Gnu@g{(|Hntjb7uMM`2_0rr`Qqj0@Fs`89)H0NQbewMzpU#PBVx}@4 zN+x4pa3I!*Ly%LVl$kQAIpI?XZ&zZv>fza7K*m0g-&O=1^nV z-1A_Pk~qDO=to6SGA3D#h$ZXdVeBq#qLZ@+k?HZ)S??I!a)hnQ@e-|G z(~XF7ChQ(O>Ik1AhDW1@O=|cg$Y7d7G@-@=;t;lI*KH3&(l#*fyGJ7wW8Gk#MGq{+ zUY{z*9w)S1RmwCZGboXNjEXLPt9xdLv+Y2wbE6oWl#tqsQVuQmsUu!a(^&PLXfkvM zn;N`jjs@F7d-io4DaqXb@IJq&;%akw1979KC+g+(pBkhzeZ5t_ZR$ z2h+C+QMSxo6gGi|gr*vK$)si35^_jLM(&@v15YyV9v8$C)g87_OQzz!0cGPR(#lqq z`Zy`_R*pDf6Q>MddNfNyey00p+5|m6CTOtUUmCBm*F+;Qt8w6qNG5B@o8c@=m+hfR zdpgcLjrYL~n?Uh+0%fvsw;cpTwk~0E8xt$_$!c&X%X6MP$(Aa{CiQ+3IX>8R5>codZSA5u6Sv;*jJ} z@n$$-lj@0tN|>27WH4@9oGXtSf^LE=AC>6f-4Kln*#xNcPX+8N!=-IYeU|6F{(ZcD zuEk}^2nOy=mFt)blq`?jR-8wW4n zlq?e>-#PR&DSS~PSd*0j!L~n27+bD3^zFes(e8%^>WORa1Kq(JTGmNJFm8TE5{)FA z$S@3uaFV6aUY?8|BNBq$le&^DP5VF>YB=6&uZTvn=~t#;%De(m*5{TKC2_2`sf2ai zWEPVUWMCLJ>B1*dvbrOd{fXhBNDp}frz0iXOvvApzOI4)M7_*cM%ezZhV^D7!Wf`I zUmB40fP~ns;F8(NukioZJeXhw?LLrqhXZW-x)o_nl7`wT6>3vc`8yno&?0Q2WOX2N z zV}zb|Ks{dELqag}DK<ARR}l}) z$(||-ZX2q_@b>&%n~6Gyw=e4}@*?Q*t1m6jnFIFW1y0*(<|Rh>pfR>KrzXg#U`@y? zV&0oUdwEg#aCLQMbKeq*4>~@8*=gbn$q>Nl4TGUF7zy5E z+V;Hqfp`xl)>tah7~Z}goaS3nRQTAys}N<1;}~AS?tpC|mRfpAHe{SP2C{EE>{pf} z=RJeuLO3O?>++~0lCK)(^kb_TAK?joacEb7WyrdN9HWvLj!~5|le)IIB^o&qmI{-* zyqL?0XgoYTx(k;#RZ6er0ZuDTTkt!uJv=-V{3E~s8StLF2VlaO00000NkvXXu0mjf DpN-AC diff --git a/src/iOS.Autofill/Resources/logo@2x.png b/src/iOS.Autofill/Resources/logo@2x.png deleted file mode 100644 index 2a0ba60b9b13983200a2c921aa6793b3c1bf09ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5449 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 diff --git a/src/iOS.Autofill/Resources/logo@3x.png b/src/iOS.Autofill/Resources/logo@3x.png deleted file mode 100644 index 90473167697b867ede9400b31c6dce93b7e39ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8426 zcmXY01zeQR(?10%0S^#q5CKU^fg_F%siV83k&vVF0O>{vsRJaAPLWROZX^Xxq>hqq zc#r?@eV)(f+1c;T%+BoYv$M}Lk!lcm0z67Q002Os@J>bp0KkBt=@1+&^s`XJcNAS< z+DNKM0sxi$f={Bh(RB(pSv@yRCu=uPGZ!m>q@|O&)k_6OGaD-nD>F-P=K(8G0N|yc zf{dh=*TQZlQhTXkHar=8nKh61tN3MN%{5H<2|X#d7O)6_z5{cDl-WA`R$O_tfQ3Ps zTA#^UzubB0_a=b9x><>j35k6M&?>bh?5j34`J5hasy;y*fWDe9W7+cMjW;8mXV=?Q9*AXlL!qDiw|2jkHL`tlRBDWCE?k*bXr#zS3#5~-y@FyGPq_@VZW z5&n`6ujGLQ0FapfD*~baYXbDg&T2gh`CHk3H#rX&lBf@mB{bWB*kZL_9U6d5$h7Fu+LcMA zP655~CJI+&{+Um7&MvMyaf&KYvxCncy6(gU$c4X94#!xs`M4kI^E% zNo!M%!GlL=D=l)oS|E>?be~o;%{)azILrWYjBMUkK{WlKBv&1)rQXDyt;if*PsOu< z$oq3ne|f_r645Q%d23%nfrfz)Z-&!hiV%_*$+sU)9yQsQP@>TSK#mV!%~FmOO#@!S zAD$1a|CQ)&a1=<9d~KQ|Xn>p4MDqzC&#JU@-+cjxWz8?1S0@z*-GCO8cpBUln5!HF zZCaEDwRXy&(GIc)&xag4d`)p#Ry4kVfoKq|xr+HJ1_3OU@~Pc6khm247xn)>N<$q& z;!b=$5NgOy-~)!{C6TTKWfHQu{jfE7%0iZl`ya~9Qrfp8v6muSA#kpT%R0qu!j5i0 zTk+mjK<+~CP}BD&)&wzGs^pWrU7nEGW?1-=%M0-!OEUQdLpi#HKG0e&q(x?rwL+uA zj^sbtmz0LdoAgz?PUuMp+ya(h1B9xz;J+VM2znR-bwJJk-#g&V^C)gG8kPV(0{jTF z{r^b|#Q47bU^RL+zC9WJ_@E{Ka~$<*`zFQq!HTHKGnDS&N0suwS@v(A=sEr;B=PKw zh{vaLxDzM;``XIKVfTBla;i?e&d$5nXie|%a(uW+k@-(1N7hcq)=n=Eg}3R`lZXt5 zdRzC0+nI8Q&iTgOUsU6pYNys@_+zyIUW!{6jHSgl#CUXmKK}P7#*}FW*y5kJz{?Kd z_W0U6!1Y*gX{c`pb=ag+CPlE`VTAVr0jOU1X#@^^MmBc!-8$9zbl2&$J)o#i+vN%o z5Y0g4uI3f@tj^!j7*!N(Fo1`wJ9|GQVDIN{HiQ_ue1B(b!8v*uFi}OH-Bc$~!*gn+ zK34AGuyc0#6_3u4P@@lrnVj8q%`1h7>Z;NCM0KW;TWqT@lBn4tlV~QmLw#s0fSf2x znrhMg<)Ji|<2T2dlk2rw#jS{B8tUbZmAYGB3+f2NV_4k5#@&-oTSJp`J4o7t4ewSv zDxnwSgz?jN>{iEQgSr_W@ZgbdRP(b~nq=Rly#9tPcabXwiEMoVl)IQjhS$JX$9vs9 zS6B4n|H8*$uHjymt-@S{t!3@q><&+{TQcJvoC_Hen^nBy_{&`DD_iw~6OPv>62WA& zIYu2ep3N^vLUMI$L?th8PUpUSbZ?xQ#izLeB;k1$iL$Y#zEJ&iJ=8g!S)2BB#?k2@ zo+wr&TdSe9Zp3H#?LvV}oX3gwBJG&b+ukqZB#6*UxK-Cz-x(fX_)Faqn&5%Wklf

*?lVy@ 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 A`2YX_ diff --git a/src/iOS.Autofill/Resources/smile.png b/src/iOS.Autofill/Resources/smile.png deleted file mode 100644 index 25f2f45b1c9e513c403159ba8e1e9cf20a51a6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2017 zcmeHH`8OMg8jYesiwe?_sL*%}YHDc{`&L`3jWm{)(9qPK{GX z6|{X$(@U#f)fI8AO&KE$w$M@}5B`-0Ds(sVuElD^v{iV=K6n_|9o$@?|C?Le!_;Hm zo9uwWaeHflz;MlPwIr@wfQ*~m(F1H(Y81ABI}u&ae|Qo-2q4qsV>NYfKU-0^Zme6(%PnCsLg`5Sf<6!?432RUL+sw{v>1a* zA-w%*j!ssmQCao-IdfJ@e#W;YN$H~}NDy)lj1ias40YkN9);G+U}ZXb^S9ABR@?BA z36$`3Lm(7M|MTyu*=)TgA|JB4|9jq9?zC64MBDV%4DBs7{#Mo2Zj*)X$w>7J%u5ky z5Z&NO0L;>ko}kNuXJvxQ!9+%qzf=pBSsaSXJ#5ey53T4Cw5~eO_L|uoZCupBI-AJu ze`?T|M&-QP0%B=fjuF>&=h^m&QTOM`67z|=IwgaCXYj|-^>8|KbovapdmIKUb@V5A z9DA(3}d!qN3zX%CFca~1g5p&ZvRj-i8>Wi^S3)0$t zA|@x??1h2R(Jx|Ag;ZQXVh1f*QI_)~ABk%t;RfwRnt?*a=Hm4)zt6FQxM^b=Q!3At zIRokVFzpWRkA3@$wY)VN=7zzfO4meHYRbAW(w%?b&E6fctGUIPtdU?BZkTCTesrzb z^ijH^>QeV@?~yCf1GxB#N;wZ)N2|{vi`tzR7>7jK( zwX>PnQs3)o9hra3_CP*Y{lc9wOVgvwO7D?;W_@xlPxdTXUZ~!!kJI8QiH-I{An?Z$0>`q)$rZXs>5`B| z0m`L;ht`^Gai;C+`jHZuNiI$ZOLB2Jk}UI?_@W=Q3;8?DcJ`N{TB`Zx}}QPp&M?wlw} zdp*D@^_T=v&TN>%PXy_Z5U+)WJ82^?ZMItApvjcI0*X{L2H(fo-UbDwoWyC!c9o+8 z{&CtMES@5?U&SP|UFNMxteZivZfxD0Vb0-~7W=4d?fw4NH>I>|WFoB8$y75j8(G&Hr9N1Mck4W-*nwkTeaW>mx(>bsp;gbniWYa;`TUaJgJS(Q=(K$_`P9e Tr62%xu8`}zGB-g8~&zOVc1?>ZmulVXlAW@g}H0002Ya1#U6U+?(uUZei2;HQWp z0Dy|u{Emg;--!AD{GY)85J0O{Mg2XF)?gIk9^eWUHO*C8x@+_dj7-cdtZeKYoLt;M zp6k4P`~reEgoH(Jiit}|%E*Gi@(PMjrCTbhYU(fzO)YI5T|Iq6BV)Mf9W%sTb0o^b z(#qP#-oeqy*~QiE9}l#rmyfUC!+@aR5KL&;N;g}YkPP9@c8un;_}x) zPti62z-Rhgc=%*fHNYV7aKPsL5KK4DgaG5o5DXm5`Pa++IfWS< zK8<_^WaazF0E%k<{8w_-!^naQAyND@COd+d`*XrCc^Esa@ZY< zgOZrUm4b!C)t@gxbEnpY%FBZm?&(Wwg4&!mRBl`!*&^`Ie%s+ymMfi_dqq~;N_F9N zgtwY_?WekkG~nG*+78QI6ra{%ke@c7%NY+k1wms7%;E`1VwrMh0<5w4=$IW>s$FS? z<{{dL{#nYBD;Cq4kkQ28KyC(=LQbtC`MZY;8Zi5G&8A&?{mD8=c{zrR{!x1?!P#cS zIjZXR_VmmvEPPSy_*A-#>fX0n#lZ>0Rnxv+lK_>+tRwWA^ZXLGBli>=PGIYA-PZ8- zPK}p8X~X2DRceFz)gt_qd9kW?!-Rl(>0w8)79TSPxrZn+AN;pCXAv=EI{ZvJ)!I*M z`bV!s!-??liA?$nh{@Tub0Dk)k@@<2r(MtGY|y~lETp|;d?HSY4(hvc4P&nd#8*+P zS$)q@yJG0W-?>T+yx2RtA`VMoT~bHb@JJS4D_VKIa@7$VX_Z)Usk31)XzHQw5i#g` zXX+LeFD42%*gu@d7T?Zj%HR8q+}1xN<#U}ZO!zg-C}DvR?`)^(xcK}+}B z3WBb+@a4adlnSDbvavkLysNWoiDe6ALi?mkkeKAMqoDilSQgtY2Ak2F);n zBDI_z$6(0df#1%zG@1eIylf=e!=u%SVugo5!Hqbg@|s6UfwfnZlN?PHfaTb=5%lu} ztgC2DhnuFt-(q?QIL?j={=ja&Xsp20AM!dObY)<=R)gi60v-$}2@n^7>w;e&+E!1+ zXb46;m@t9T<-<~>W+Nz`kUgAAd_eEEb?zb9#hs)o77+PrCPiu{b9Slc8j!sr%|5j$n|@w- zyPhmf*p4urleMLmdl3FDNoRlWt|!E;Z$xE8U|*N(d}aB47Ez%(@EkIlX3$&IXWQp$ zFc^^cY(UOm6VmFrktClfB(-%Y&IxqHswB{~h$_osq@XyZFPiWp(Ni(mCUEslQE#sB zB8E_(EJD*{Ti|+NYc6^MnJ-6717~UbIU6x>-hlgEbzsjI*ymKBPq7${dIfg1e3$m2 zW-N~Kf?nc^;LJF37caG) zgK-@CV}oH?M?-G*bLw3H$(@#tr8By?-ycC?tD6;4@>KecOWluDjuu@&do^6mv85!R zg2U<%;9go!W=A6tH>+M&#u(>-ZdVnnU|Wpqs*OCXIW-%zZ9v&}c(RMkwotvpc&{S2 z%WV?z`tu=aTHLN3GSu^?8QOY}(xc?)ih&t+Hv>lVtIV#jSmLud^;b3wG<&aSf>1p&q|Z)mA3p($OPD48`7@;u85=#C&3IEIkwpF_9k?S8o9i)*|49eZ z<#}Wr-0uD%o`YlLXB4&7sv>dufRuoVD*NQ!z6zysUu|eyj$%IGP|=qBo`Y4fuqg}o`BPyr7ibOf z&*71;2}2H+2Ol!NAm4T?v4*%=uAQ{r*v#$C=Ywm?e4O=^wJ@ys z%H#J`clbX%K&CT9ej>BcC~R^^8q)h^_tDyV*OGr02k^z7uMe{j)Z^vRgm=;B;ts>- z%7UFn&T%4E{rxfHzR-9Gsn%|cQZb9*q@9@bH-jDLvhtxg5Ei>y0fFVs)yv9ssNKHa z7u}kt{kWdtzX-Pofr$hSWCG5K-$h4Oo++pOnIZ1U#z|o!Zw#t?@|SLqDcw2wYv21I zROY1xr7@__+i1(uNY%xDT|F-a7vqP{e>!FuR*7pn7`$uF@|{NRkJp;xiU-PS3;wJx z?_J~$Cu~9RzH-h7`BCY}0{7oJ&E4OT;}$u(FvC9m{l>Iy{GNO2P>)sCQa zCOfh+X#vFbCson0R5j5CldNEju45>DbTZ2Ao6Uu#G}622R74>}MG^&bC-r4lZ3f+U{e-|gv?grNVz_tW z%9Ns*6zRMj)qF$fh%TgOsTHC!C7|<^j%5gevgL}S27DZTU^m}Z#}e$mNK<(d18iJ* z@O1plpRlEFCJAxA;8?JdDrUY^;Ltofv2WI&YV7T4VSVXkUMCIx!U>$XJtGro;4bNP zw0z5GdS>edg5fi*`)*uRoUr0jU7h|9UQ|*r)TkjTSwLB8-fV~2;G}Le_jAxcp(P9d z$om>Yd2J_7-j zU`q2E$Y#B1)nHqDY*%S`n7CFLV(Q#>5Q-dsqpY5R_IZYydKF%bPE#5k-nOo9Td6lp zFx{^whjm+|@qPVOVzjY;++Kt7=-FygYy9py>0&5;9X`x&i$arf^(0Dv1J3>x+B$NmQt^5(bz diff --git a/src/iOS.Autofill/Resources/smile@3x.png b/src/iOS.Autofill/Resources/smile@3x.png deleted file mode 100644 index 6e7189e69c140b10692800db22501fcfc443b344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5468 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 - } - - partial void BackButton_Activated(UIBarButtonItem sender) - { - CPViewController.CompleteRequest(); - } - } -} diff --git a/src/iOS.Autofill/SetupViewController.designer.cs b/src/iOS.Autofill/SetupViewController.designer.cs deleted file mode 100644 index 7374b7e8f..000000000 --- a/src/iOS.Autofill/SetupViewController.designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Visual Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Autofill -{ - [Register ("SetupViewController")] - partial class SetupViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel ActivatedLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem BackButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel DescriptionLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIImageView IconImage { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Action ("BackButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void BackButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (ActivatedLabel != null) { - ActivatedLabel.Dispose (); - ActivatedLabel = null; - } - - if (BackButton != null) { - BackButton.Dispose (); - BackButton = null; - } - - if (DescriptionLabel != null) { - DescriptionLabel.Dispose (); - DescriptionLabel = null; - } - - if (IconImage != null) { - IconImage.Dispose (); - IconImage = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Autofill/Utilities/AutofillHelpers.cs b/src/iOS.Autofill/Utilities/AutofillHelpers.cs deleted file mode 100644 index b82bcc101..000000000 --- a/src/iOS.Autofill/Utilities/AutofillHelpers.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Linq; -using Bit.App.Resources; -using Bit.iOS.Core.Utilities; -using Bit.iOS.Core.Views; -using Foundation; -using Plugin.Settings.Abstractions; -using UIKit; - -namespace Bit.iOS.Autofill.Utilities -{ - public static class AutofillHelpers - { - public static void TableRowSelected(UITableView tableView, NSIndexPath indexPath, - ExtensionTableSource tableSource, CredentialProviderViewController cpViewController, - UITableViewController controller, ISettings settings, string loginAddSegue) - { - tableView.DeselectRow(indexPath, true); - tableView.EndEditing(true); - - if(tableSource.Items == null || tableSource.Items.Count() == 0) - { - controller.PerformSegue(loginAddSegue, tableSource); - return; - } - - var item = tableSource.Items.ElementAt(indexPath.Row); - if(item == null) - { - cpViewController.CompleteRequest(null); - return; - } - - if(!string.IsNullOrWhiteSpace(item.Username) && !string.IsNullOrWhiteSpace(item.Password)) - { - string totp = null; - if(!settings.GetValueOrDefault(App.Constants.SettingDisableTotpCopy, false)) - { - totp = tableSource.GetTotp(item); - } - - cpViewController.CompleteRequest(item.Username, item.Password, totp); - } - else if(!string.IsNullOrWhiteSpace(item.Username) || !string.IsNullOrWhiteSpace(item.Password) || - !string.IsNullOrWhiteSpace(item.Totp.Value)) - { - var sheet = Dialogs.CreateActionSheet(item.Name, controller); - if(!string.IsNullOrWhiteSpace(item.Username)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyUsername, UIAlertActionStyle.Default, a => - { - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = item.Username; - var alert = Dialogs.CreateMessageAlert(AppResources.CopyUsername); - controller.PresentViewController(alert, true, () => - { - controller.DismissViewController(true, null); - }); - })); - } - - if(!string.IsNullOrWhiteSpace(item.Password)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyPassword, UIAlertActionStyle.Default, a => - { - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = item.Password; - var alert = Dialogs.CreateMessageAlert(AppResources.CopiedPassword); - controller.PresentViewController(alert, true, () => - { - controller.DismissViewController(true, null); - }); - })); - } - - if(!string.IsNullOrWhiteSpace(item.Totp.Value)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyTotp, UIAlertActionStyle.Default, a => - { - var totp = tableSource.GetTotp(item); - if(string.IsNullOrWhiteSpace(totp)) - { - return; - } - - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = totp; - var alert = Dialogs.CreateMessageAlert(AppResources.CopiedTotp); - controller.PresentViewController(alert, true, () => - { - controller.DismissViewController(true, null); - }); - })); - } - - sheet.AddAction(UIAlertAction.Create(AppResources.Cancel, UIAlertActionStyle.Cancel, null)); - controller.PresentViewController(sheet, true, null); - } - else - { - var alert = Dialogs.CreateAlert(null, AppResources.NoUsernamePasswordConfigured, AppResources.Ok); - controller.PresentViewController(alert, true, null); - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Autofill/iOS.Autofill.csproj b/src/iOS.Autofill/iOS.Autofill.csproj deleted file mode 100644 index 4c29600c9..000000000 --- a/src/iOS.Autofill/iOS.Autofill.csproj +++ /dev/null @@ -1,302 +0,0 @@ - - - Debug - iPhoneSimulator - {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F} - {EE2C853D-36AF-4FDB-B1AD-8E90477E2198};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - Bit.iOS.Autofill - BitwardeniOSAutofill - Resources - Properties - - - - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - i386, x86_64 - None - True - Entitlements.plist - 12.0 - False - False - False - False - True - False - False - Default - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler - - - none - true - bin\iPhoneSimulator\Release - prompt - 4 - Full - i386, x86_64 - false - Entitlements.plist - 9.3 - False - False - False - False - False - False - True - Default - NSUrlSessionHandler - False - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARM64 - Entitlements.plist - iPhone Developer - True - - - - - None - False - False - False - False - False - True - False - False - --http-message-handler=NSUrlSessionHandler - - - Default - NSUrlSessionHandler - - - none - true - bin\iPhone\Release - prompt - 4 - Entitlements.plist - ARM64 - false - iPhone Developer - Full - False - False - False - False - False - False - True - False - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARM64 - Entitlements.plist - True - Automatic:AdHoc - iPhone Distribution - Full - False - False - False - False - False - False - True - False - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARM64 - Entitlements.plist - Automatic:AppStore - iPhone Distribution - Full - False - False - False - False - False - False - True - False - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - 10.2 - Default - NSUrlSessionHandler - - - 9.3 - Full - False - False - False - i386, x86_64 - False - False - False - True - Default - NSUrlSessionHandler - False - bin\iPhoneSimulator\Ad-Hoc - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - Entitlements.plist - - - 9.3 - Full - False - False - False - i386, x86_64 - False - False - False - True - Default - NSUrlSessionHandler - False - bin\iPhoneSimulator\AppStore - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSAutofill --linkskip=BitwardenApp --linkskip=SQLite-net - - - - - - - - - - - - - - - SetupViewController.cs - - - - - - - - - - CredentialProviderViewController.cs - - - - LockFingerprintViewController.cs - - - LockPasswordViewController.cs - - - LockPinViewController.cs - - - LoginAddViewController.cs - - - LoginListViewController.cs - - - PasswordGeneratorViewController.cs - - - - LoginSearchViewController.cs - - - - - - - - - - - - - - - - - - - - - - - - - - {8a279ee4-4537-4656-9c93-44945e594556} - App - - - {B2538ADA-B605-4D6F-ACD2-62A409680F84} - iOS.Core - False - False - - - - - 4.4.0 - - - 2.0.5782 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/iOS.Core/Constants.cs b/src/iOS.Core/Constants.cs deleted file mode 100644 index 50941c0bb..000000000 --- a/src/iOS.Core/Constants.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace Bit.iOS.Core -{ - public static class Constants - { - public const string AppExtensionVersionNumberKey = "version_number"; - public const string AppExtensionUrlStringKey = "url_string"; - public const string AppExtensionUsernameKey = "username"; - public const string AppExtensionPasswordKey = "password"; - public const string AppExtensionTotpKey = "totp"; - public const string AppExtensionTitleKey = "login_title"; - public const string AppExtensionNotesKey = "notes"; - public const string AppExtensionSectionTitleKey = "section_title"; - public const string AppExtensionFieldsKey = "fields"; - public const string AppExtensionReturnedFieldsKey = "returned_fields"; - public const string AppExtensionOldPasswordKey = "old_password"; - public const string AppExtensionPasswordGeneratorOptionsKey = "password_generator_options"; - public const string AppExtensionGeneratedPasswordMinLengthKey = "password_min_length"; - public const string AppExtensionGeneratedPasswordMaxLengthKey = "password_max_length"; - public const string AppExtensionGeneratedPasswordRequireDigitsKey = "password_require_digits"; - public const string AppExtensionGeneratedPasswordRequireSymbolsKey = "password_require_symbols"; - public const string AppExtensionGeneratedPasswordForbiddenCharactersKey = "password_forbidden_characters"; - public const string AppExtensionWebViewPageFillScript = "fillScript"; - public const string AppExtensionWebViewPageDetails = "pageDetails"; - - public const string UTTypeAppExtensionFindLoginAction = "org.appextension.find-login-action"; - public const string UTTypeAppExtensionSaveLoginAction = "org.appextension.save-login-action"; - public const string UTTypeAppExtensionChangePasswordAction = "org.appextension.change-password-action"; - public const string UTTypeAppExtensionFillWebViewAction = "org.appextension.fill-webview-action"; - public const string UTTypeAppExtensionFillBrowserAction = "org.appextension.fill-browser-action"; - public const string UTTypeAppExtensionSetup = "com.8bit.bitwarden.extension-setup"; - } -} diff --git a/src/iOS.Core/Controllers/ExtendedUITableViewController.cs b/src/iOS.Core/Controllers/ExtendedUITableViewController.cs deleted file mode 100644 index 26ebd1184..000000000 --- a/src/iOS.Core/Controllers/ExtendedUITableViewController.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Bit.App.Abstractions; -using System; -using UIKit; -using XLabs.Ioc; - -namespace Bit.iOS.Core.Controllers -{ - public class ExtendedUITableViewController : UITableViewController - { - public ExtendedUITableViewController(IntPtr handle) - : base(handle) - { } - - public override void ViewDidAppear(bool animated) - { - var googleAnalyticsService = Resolver.Resolve(); - googleAnalyticsService.TrackPage(GetType().Name); - base.ViewDidAppear(animated); - } - } -} diff --git a/src/iOS.Core/Controllers/ExtendedUIViewController.cs b/src/iOS.Core/Controllers/ExtendedUIViewController.cs deleted file mode 100644 index 49cde1e34..000000000 --- a/src/iOS.Core/Controllers/ExtendedUIViewController.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using UIKit; -using Bit.App.Abstractions; -using XLabs.Ioc; - -namespace Bit.iOS.Core.Controllers -{ - public class ExtendedUIViewController : UIViewController - { - public ExtendedUIViewController(IntPtr handle) - : base(handle) - { } - - public override void ViewDidAppear(bool animated) - { - var googleAnalyticsService = Resolver.Resolve(); - googleAnalyticsService.TrackPage(GetType().Name); - base.ViewDidAppear(animated); - } - } -} diff --git a/src/iOS.Core/Controllers/LockFingerprintViewController.cs b/src/iOS.Core/Controllers/LockFingerprintViewController.cs deleted file mode 100644 index 43447d96d..000000000 --- a/src/iOS.Core/Controllers/LockFingerprintViewController.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using UIKit; -using XLabs.Ioc; -using Plugin.Fingerprint.Abstractions; -using System.Threading.Tasks; -using Bit.iOS.Core.Controllers; -using Bit.App.Resources; -using Bit.App.Abstractions; - -namespace Bit.iOS.Core.Controllers -{ - public abstract class LockFingerprintViewController : ExtendedUIViewController - { - private IAppSettingsService _appSettingsService; - private IFingerprint _fingerprint; - private IDeviceInfoService _deviceInfo; - - public LockFingerprintViewController(IntPtr handle) : base(handle) - { } - - public abstract UINavigationItem BaseNavItem { get; } - public abstract UIBarButtonItem BaseCancelButton { get; } - public abstract UIButton BaseUseButton { get; } - public abstract UIButton BaseFingerprintButton { get; } - public abstract Action Success { get; } - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public override void ViewDidLoad() - { - _appSettingsService = Resolver.Resolve(); - _fingerprint = Resolver.Resolve(); - _deviceInfo = Resolver.Resolve(); - - BaseNavItem.Title = _deviceInfo.HasFaceIdSupport ? AppResources.VerifyFaceID : AppResources.VerifyFingerprint; - BaseCancelButton.Title = AppResources.Cancel; - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - - BaseUseButton.SetTitle(_deviceInfo.HasFaceIdSupport ? AppResources.UseFaceIDToUnlock : - AppResources.UseFingerprintToUnlock, UIControlState.Normal); - var descriptor = UIFontDescriptor.PreferredBody; - BaseUseButton.Font = UIFont.FromDescriptor(descriptor, descriptor.PointSize); - BaseUseButton.BackgroundColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f); - BaseUseButton.TintColor = UIColor.White; - BaseUseButton.TouchUpInside += UseButton_TouchUpInside; - - BaseFingerprintButton.SetImage(new UIImage(_deviceInfo.HasFaceIdSupport ? "smile.png" : "fingerprint.png"), - UIControlState.Normal); - - base.ViewDidLoad(); - } - - private void UseButton_TouchUpInside(object sender, EventArgs e) - { - var task = CheckFingerprintAsync(); - } - - public override void ViewDidAppear(bool animated) - { - base.ViewDidAppear(animated); - var task = CheckFingerprintAsync(); - } - - public async Task CheckFingerprintAsync() - { - var fingerprintRequest = new AuthenticationRequestConfiguration( - _deviceInfo.HasFaceIdSupport ? AppResources.FaceIDDirection : AppResources.FingerprintDirection) - { - AllowAlternativeAuthentication = true, - CancelTitle = AppResources.Cancel, - FallbackTitle = AppResources.LogOut - }; - var result = await _fingerprint.AuthenticateAsync(fingerprintRequest); - if(result.Authenticated) - { - _appSettingsService.Locked = false; - Success(); - } - } - } -} diff --git a/src/iOS.Core/Controllers/LockPasswordViewController.cs b/src/iOS.Core/Controllers/LockPasswordViewController.cs deleted file mode 100644 index 0b5ec45e1..000000000 --- a/src/iOS.Core/Controllers/LockPasswordViewController.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using UIKit; -using XLabs.Ioc; -using Foundation; -using Bit.iOS.Core.Views; -using Bit.App.Resources; -using Bit.iOS.Core.Utilities; -using Bit.App.Abstractions; -using System.Linq; -using Bit.iOS.Core.Controllers; - -namespace Bit.iOS.Core.Controllers -{ - public abstract class LockPasswordViewController : ExtendedUITableViewController - { - private IAppSettingsService _appSettingsService; - private IAuthService _authService; - private ICryptoService _cryptoService; - - public LockPasswordViewController(IntPtr handle) : base(handle) - { } - - public abstract UINavigationItem BaseNavItem { get; } - public abstract UIBarButtonItem BaseCancelButton { get; } - public abstract UIBarButtonItem BaseSubmitButton { get; } - public abstract Action Success { get; } - - public FormEntryTableViewCell MasterPasswordCell { get; set; } = new FormEntryTableViewCell( - AppResources.MasterPassword, useLabelAsPlaceholder: true); - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public override void ViewDidLoad() - { - _appSettingsService = Resolver.Resolve(); - _authService = Resolver.Resolve(); - _cryptoService = Resolver.Resolve(); - - BaseNavItem.Title = AppResources.VerifyMasterPassword; - BaseCancelButton.Title = AppResources.Cancel; - BaseSubmitButton.Title = AppResources.Submit; - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - - var descriptor = UIFontDescriptor.PreferredBody; - - MasterPasswordCell.TextField.SecureTextEntry = true; - MasterPasswordCell.TextField.ReturnKeyType = UIReturnKeyType.Go; - MasterPasswordCell.TextField.ShouldReturn += (UITextField tf) => - { - CheckPassword(); - return true; - }; - - TableView.RowHeight = UITableView.AutomaticDimension; - TableView.EstimatedRowHeight = 70; - TableView.Source = new TableSource(this); - TableView.AllowsSelection = true; - - base.ViewDidLoad(); - } - - public override void ViewDidAppear(bool animated) - { - base.ViewDidAppear(animated); - MasterPasswordCell.TextField.BecomeFirstResponder(); - } - - protected void CheckPassword() - { - if(string.IsNullOrWhiteSpace(MasterPasswordCell.TextField.Text)) - { - var alert = Dialogs.CreateAlert(AppResources.AnErrorHasOccurred, - string.Format(AppResources.ValidationFieldRequired, AppResources.MasterPassword), AppResources.Ok); - PresentViewController(alert, true, null); - return; - } - - var key = _cryptoService.MakeKeyFromPassword(MasterPasswordCell.TextField.Text, _authService.Email, - _authService.Kdf, _authService.KdfIterations); - if(key.Key.SequenceEqual(_cryptoService.Key.Key)) - { - _appSettingsService.Locked = false; - MasterPasswordCell.TextField.ResignFirstResponder(); - Success(); - } - else - { - // TODO: keep track of invalid attempts and logout? - - var alert = Dialogs.CreateAlert(AppResources.AnErrorHasOccurred, - string.Format(null, AppResources.InvalidMasterPassword), AppResources.Ok, (a) => - { - - MasterPasswordCell.TextField.Text = string.Empty; - MasterPasswordCell.TextField.BecomeFirstResponder(); - }); - - PresentViewController(alert, true, null); - } - } - - public class TableSource : UITableViewSource - { - private LockPasswordViewController _controller; - - public TableSource(LockPasswordViewController controller) - { - _controller = controller; - } - - public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) - { - if(indexPath.Section == 0) - { - if(indexPath.Row == 0) - { - return _controller.MasterPasswordCell; - } - } - - return new UITableViewCell(); - } - - public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) - { - return UITableView.AutomaticDimension; - } - - public override nint NumberOfSections(UITableView tableView) - { - return 1; - } - - public override nint RowsInSection(UITableView tableview, nint section) - { - if(section == 0) - { - return 1; - } - - return 0; - } - - public override nfloat GetHeightForHeader(UITableView tableView, nint section) - { - return UITableView.AutomaticDimension; - } - - public override string TitleForHeader(UITableView tableView, nint section) - { - return null; - } - - public override void RowSelected(UITableView tableView, NSIndexPath indexPath) - { - tableView.DeselectRow(indexPath, true); - tableView.EndEditing(true); - - var cell = tableView.CellAt(indexPath); - if(cell == null) - { - return; - } - - var selectableCell = cell as ISelectable; - if(selectableCell != null) - { - selectableCell.Select(); - } - } - } - } -} diff --git a/src/iOS.Core/Controllers/LockPinViewController.cs b/src/iOS.Core/Controllers/LockPinViewController.cs deleted file mode 100644 index 2211c69e6..000000000 --- a/src/iOS.Core/Controllers/LockPinViewController.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using UIKit; -using XLabs.Ioc; -using Bit.App.Abstractions; -using Bit.iOS.Core.Utilities; -using Bit.App.Resources; -using System.Diagnostics; -using Bit.iOS.Core.Controllers; - -namespace Bit.iOS.Core.Controllers -{ - public abstract class LockPinViewController : ExtendedUIViewController - { - private IAppSettingsService _appSettingsService; - private IAuthService _authService; - - public LockPinViewController(IntPtr handle) : base(handle) - { } - - public abstract UINavigationItem BaseNavItem { get; } - public abstract UIBarButtonItem BaseCancelButton { get; } - public abstract UILabel BasePinLabel { get; } - public abstract UILabel BaseInstructionLabel { get; } - public abstract UITextField BasePinTextField { get; } - public abstract Action Success { get; } - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public override void ViewDidLoad() - { - _appSettingsService = Resolver.Resolve(); - _authService = Resolver.Resolve(); - - BaseNavItem.Title = AppResources.VerifyPIN; - BaseCancelButton.Title = AppResources.Cancel; - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - - var descriptor = UIFontDescriptor.PreferredBody; - BasePinLabel.Font = UIFont.FromName("Menlo-Regular", 35); - - BaseInstructionLabel.Text = AppResources.EnterPIN; - BaseInstructionLabel.LineBreakMode = UILineBreakMode.WordWrap; - BaseInstructionLabel.Lines = 0; - BaseInstructionLabel.Font = UIFont.FromDescriptor(descriptor, descriptor.PointSize * 0.8f); - BaseInstructionLabel.TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); - - BasePinTextField.EditingChanged += PinTextField_EditingChanged; - - base.ViewDidLoad(); - } - - public override void ViewDidAppear(bool animated) - { - base.ViewDidAppear(animated); - BasePinTextField.BecomeFirstResponder(); - } - - private void PinTextField_EditingChanged(object sender, EventArgs e) - { - SetLabelText(); - - if(BasePinTextField.Text.Length >= 4) - { - if(BasePinTextField.Text == _authService.PIN) - { - Debug.WriteLine("BW Log, Start Dismiss PIN controller."); - _appSettingsService.Locked = false; - BasePinTextField.ResignFirstResponder(); - Success(); - } - else - { - // TODO: keep track of invalid attempts and logout? - - var alert = Dialogs.CreateAlert(null, AppResources.InvalidPIN, AppResources.Ok, (a) => - { - BasePinTextField.Text = string.Empty; - SetLabelText(); - BasePinTextField.BecomeFirstResponder(); - }); - PresentViewController(alert, true, null); - } - } - } - - private void SetLabelText() - { - var newText = string.Empty; - for(int i = 0; i < 4; i++) - { - newText += BasePinTextField.Text.Length <= i ? "- " : "• "; - } - - BasePinLabel.Text = newText.TrimEnd(); - } - } -} diff --git a/src/iOS.Core/Controllers/LoginAddViewController.cs b/src/iOS.Core/Controllers/LoginAddViewController.cs deleted file mode 100644 index 7076a88bd..000000000 --- a/src/iOS.Core/Controllers/LoginAddViewController.cs +++ /dev/null @@ -1,338 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Bit.App.Abstractions; -using Bit.App.Models; -using Bit.App.Resources; -using Bit.iOS.Core.Views; -using Foundation; -using UIKit; -using XLabs.Ioc; -using Bit.App; -using Plugin.Connectivity.Abstractions; -using Bit.iOS.Core.Utilities; -using Bit.iOS.Core.Models; -using System.Threading.Tasks; -using AuthenticationServices; - -namespace Bit.iOS.Core.Controllers -{ - public abstract class LoginAddViewController : ExtendedUITableViewController - { - private ICipherService _cipherService; - private IFolderService _folderService; - private IConnectivity _connectivity; - private IEnumerable _folders; - protected IGoogleAnalyticsService _googleAnalyticsService; - - public LoginAddViewController(IntPtr handle) : base(handle) - { - } - - public AppExtensionContext Context { get; set; } - public FormEntryTableViewCell NameCell { get; set; } = new FormEntryTableViewCell(AppResources.Name); - public FormEntryTableViewCell UsernameCell { get; set; } = new FormEntryTableViewCell(AppResources.Username); - public FormEntryTableViewCell PasswordCell { get; set; } = new FormEntryTableViewCell(AppResources.Password); - public UITableViewCell GeneratePasswordCell { get; set; } = new UITableViewCell(UITableViewCellStyle.Subtitle, "GeneratePasswordCell"); - public FormEntryTableViewCell UriCell { get; set; } = new FormEntryTableViewCell(AppResources.URI); - public SwitchTableViewCell FavoriteCell { get; set; } = new SwitchTableViewCell(AppResources.Favorite); - public FormEntryTableViewCell NotesCell { get; set; } = new FormEntryTableViewCell(useTextView: true, height: 180); - public PickerTableViewCell FolderCell { get; set; } = new PickerTableViewCell(AppResources.Folder); - - public abstract UINavigationItem BaseNavItem { get; } - public abstract UIBarButtonItem BaseCancelButton { get; } - public abstract UIBarButtonItem BaseSaveButton { get; } - public abstract Action Success { get; } - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public override void ViewDidLoad() - { - _cipherService = Resolver.Resolve(); - _connectivity = Resolver.Resolve(); - _folderService = Resolver.Resolve(); - _googleAnalyticsService = Resolver.Resolve(); - - BaseNavItem.Title = AppResources.AddItem; - BaseCancelButton.Title = AppResources.Cancel; - BaseSaveButton.Title = AppResources.Save; - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - - NameCell.TextField.Text = Context?.Uri?.Host ?? string.Empty; - NameCell.TextField.ReturnKeyType = UIReturnKeyType.Next; - NameCell.TextField.ShouldReturn += (UITextField tf) => - { - UsernameCell.TextField.BecomeFirstResponder(); - return true; - }; - - UsernameCell.TextField.AutocapitalizationType = UITextAutocapitalizationType.None; - UsernameCell.TextField.AutocorrectionType = UITextAutocorrectionType.No; - UsernameCell.TextField.SpellCheckingType = UITextSpellCheckingType.No; - UsernameCell.TextField.ReturnKeyType = UIReturnKeyType.Next; - UsernameCell.TextField.ShouldReturn += (UITextField tf) => - { - PasswordCell.TextField.BecomeFirstResponder(); - return true; - }; - - PasswordCell.TextField.SecureTextEntry = true; - PasswordCell.TextField.ReturnKeyType = UIReturnKeyType.Next; - PasswordCell.TextField.ShouldReturn += (UITextField tf) => - { - UriCell.TextField.BecomeFirstResponder(); - return true; - }; - - GeneratePasswordCell.TextLabel.Text = AppResources.GeneratePassword; - GeneratePasswordCell.Accessory = UITableViewCellAccessory.DisclosureIndicator; - - UriCell.TextField.Text = Context?.UrlString ?? string.Empty; - UriCell.TextField.KeyboardType = UIKeyboardType.Url; - UriCell.TextField.ReturnKeyType = UIReturnKeyType.Next; - UriCell.TextField.ShouldReturn += (UITextField tf) => - { - NotesCell.TextView.BecomeFirstResponder(); - return true; - }; - - _folders = _folderService.GetAllAsync().GetAwaiter().GetResult(); - var folderNames = _folders.Select(s => s.Name.Decrypt()).OrderBy(s => s).ToList(); - folderNames.Insert(0, AppResources.FolderNone); - FolderCell.Items = folderNames; - - TableView.RowHeight = UITableView.AutomaticDimension; - TableView.EstimatedRowHeight = 70; - TableView.Source = new TableSource(this); - TableView.AllowsSelection = true; - - base.ViewDidLoad(); - } - - public override void ViewDidAppear(bool animated) - { - base.ViewDidAppear(animated); - } - - protected async Task SaveAsync() - { - if(!_connectivity.IsConnected) - { - AlertNoConnection(); - return; - } - - if(string.IsNullOrWhiteSpace(PasswordCell.TextField.Text)) - { - DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Password), AppResources.Ok); - return; - } - - if(string.IsNullOrWhiteSpace(NameCell.TextField.Text)) - { - DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Name), AppResources.Ok); - return; - } - - var cipher = new Cipher - { - Name = string.IsNullOrWhiteSpace(NameCell.TextField.Text) ? null : NameCell.TextField.Text.Encrypt(), - Notes = string.IsNullOrWhiteSpace(NotesCell.TextView.Text) ? null : NotesCell.TextView.Text.Encrypt(), - Favorite = FavoriteCell.Switch.On, - FolderId = FolderCell.SelectedIndex == 0 ? null : _folders.ElementAtOrDefault(FolderCell.SelectedIndex - 1)?.Id, - Type = App.Enums.CipherType.Login, - Login = new Login - { - Uris = null, - Username = string.IsNullOrWhiteSpace(UsernameCell.TextField.Text) ? null : UsernameCell.TextField.Text.Encrypt(), - Password = string.IsNullOrWhiteSpace(PasswordCell.TextField.Text) ? null : PasswordCell.TextField.Text.Encrypt() - } - }; - - if(!string.IsNullOrWhiteSpace(UriCell.TextField.Text)) - { - cipher.Login.Uris = new List - { - new LoginUri - { - Uri = UriCell.TextField.Text.Encrypt() - } - }; - } - - var saveTask = _cipherService.SaveAsync(cipher); - var loadingAlert = Dialogs.CreateLoadingAlert(AppResources.Saving); - PresentViewController(loadingAlert, true, null); - await saveTask; - - await loadingAlert.DismissViewControllerAsync(true); - if(saveTask.Result.Succeeded) - { - if (await ASHelpers.IdentitiesCanIncremental()) - { - var identity = await ASHelpers.GetCipherIdentityAsync(saveTask.Result.Result.Id, _cipherService); - if (identity != null) - { - await ASCredentialIdentityStore.SharedStore.SaveCredentialIdentitiesAsync( - new ASPasswordCredentialIdentity[] { identity }); - } - } - else - { - await ASHelpers.ReplaceAllIdentities(_cipherService); - } - Success(); - } - else if(saveTask.Result.Errors.Count() > 0) - { - DisplayAlert(AppResources.AnErrorHasOccurred, saveTask.Result.Errors.First().Message, AppResources.Ok); - } - else - { - DisplayAlert(null, AppResources.AnErrorHasOccurred, AppResources.Ok); - } - } - - public void DisplayAlert(string title, string message, string accept) - { - var alert = Dialogs.CreateAlert(title, message, accept); - PresentViewController(alert, true, null); - } - - private void AlertNoConnection() - { - DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok); - } - - public class TableSource : UITableViewSource - { - private LoginAddViewController _controller; - - public TableSource(LoginAddViewController controller) - { - _controller = controller; - } - - public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) - { - if(indexPath.Section == 0) - { - if(indexPath.Row == 0) - { - return _controller.NameCell; - } - else if(indexPath.Row == 1) - { - return _controller.UsernameCell; - } - else if(indexPath.Row == 2) - { - return _controller.PasswordCell; - } - else if(indexPath.Row == 3) - { - return _controller.GeneratePasswordCell; - } - } - else if(indexPath.Section == 1) - { - return _controller.UriCell; - } - else if(indexPath.Section == 2) - { - if(indexPath.Row == 0) - { - return _controller.FolderCell; - } - else if(indexPath.Row == 1) - { - return _controller.FavoriteCell; - } - } - else if(indexPath.Section == 3) - { - return _controller.NotesCell; - } - - return new UITableViewCell(); - } - - public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) - { - return UITableView.AutomaticDimension; - } - - public override nint NumberOfSections(UITableView tableView) - { - return 4; - } - - public override nint RowsInSection(UITableView tableview, nint section) - { - if(section == 0) - { - return 4; - } - else if(section == 1) - { - return 1; - } - else if(section == 2) - { - return 2; - } - else - { - return 1; - } - } - - public override nfloat GetHeightForHeader(UITableView tableView, nint section) - { - return section == 0 || section == 3 ? UITableView.AutomaticDimension : 0.00001f; - } - - public override string TitleForHeader(UITableView tableView, nint section) - { - if(section == 0) - { - return AppResources.ItemInformation; - } - else if(section == 3) - { - return AppResources.Notes; - } - - return string.Empty; - } - - public override void RowSelected(UITableView tableView, NSIndexPath indexPath) - { - tableView.DeselectRow(indexPath, true); - tableView.EndEditing(true); - - if(indexPath.Section == 0 && indexPath.Row == 3) - { - _controller.PerformSegue("passwordGeneratorSegue", this); - } - - var cell = tableView.CellAt(indexPath); - if(cell == null) - { - return; - } - - var selectableCell = cell as ISelectable; - if(selectableCell != null) - { - selectableCell.Select(); - } - } - } - } -} diff --git a/src/iOS.Core/Controllers/PasswordGeneratorViewController.cs b/src/iOS.Core/Controllers/PasswordGeneratorViewController.cs deleted file mode 100644 index 089c7b447..000000000 --- a/src/iOS.Core/Controllers/PasswordGeneratorViewController.cs +++ /dev/null @@ -1,360 +0,0 @@ -using System; -using System.Linq; -using Bit.App.Abstractions; -using Bit.iOS.Core.Views; -using Bit.iOS.Core.Models; -using Foundation; -using UIKit; -using XLabs.Ioc; -using Plugin.Settings.Abstractions; -using CoreGraphics; -using Bit.iOS.Core.Utilities; -using Bit.App.Resources; - -namespace Bit.iOS.Core.Controllers -{ - public abstract class PasswordGeneratorViewController : ExtendedUIViewController - { - private IPasswordGenerationService _passwordGenerationService; - private ISettings _settings; - private bool _isAutofill; - - public PasswordGeneratorViewController(IntPtr handle, bool autofill) : base(handle) - { - _isAutofill = autofill; - } - - protected IGoogleAnalyticsService GoogleAnalyticsService { get; private set; } - public UITableViewController OptionsTableViewController { get; set; } - public SwitchTableViewCell UppercaseCell { get; set; } = new SwitchTableViewCell("A-Z"); - public SwitchTableViewCell LowercaseCell { get; set; } = new SwitchTableViewCell("a-z"); - public SwitchTableViewCell NumbersCell { get; set; } = new SwitchTableViewCell("0-9"); - public SwitchTableViewCell SpecialCell { get; set; } = new SwitchTableViewCell("!@#$%^&*"); - public StepperTableViewCell MinNumbersCell { get; set; } = new StepperTableViewCell(AppResources.MinNumbers, 1, 0, 5, 1); - public StepperTableViewCell MinSpecialCell { get; set; } = new StepperTableViewCell(AppResources.MinSpecial, 1, 0, 5, 1); - public SliderTableViewCell LengthCell { get; set; } = new SliderTableViewCell(AppResources.Length, 10, 5, 64); - - public PasswordGenerationOptions PasswordOptions { get; set; } - public abstract UINavigationItem BaseNavItem { get; } - public abstract UIBarButtonItem BaseCancelButton { get; } - public abstract UIBarButtonItem BaseSelectBarButton { get; } - public abstract UILabel BasePasswordLabel { get; } - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public override void ViewDidLoad() - { - _passwordGenerationService = Resolver.Resolve(); - _settings = Resolver.Resolve(); - GoogleAnalyticsService = Resolver.Resolve(); - - BaseNavItem.Title = AppResources.PasswordGenerator; - BaseCancelButton.Title = AppResources.Cancel; - BaseSelectBarButton.Title = AppResources.Select; - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - - var descriptor = UIFontDescriptor.PreferredBody; - BasePasswordLabel.Font = UIFont.FromName("Menlo-Regular", descriptor.PointSize * 1.3f); - BasePasswordLabel.LineBreakMode = UILineBreakMode.TailTruncation; - BasePasswordLabel.Lines = 1; - BasePasswordLabel.AdjustsFontSizeToFitWidth = false; - - var controller = ChildViewControllers.LastOrDefault(); - if(controller != null) - { - OptionsTableViewController = controller as UITableViewController; - } - - if(OptionsTableViewController != null) - { - OptionsTableViewController.TableView.RowHeight = UITableView.AutomaticDimension; - OptionsTableViewController.TableView.EstimatedRowHeight = 70; - OptionsTableViewController.TableView.Source = new TableSource(this); - OptionsTableViewController.TableView.AllowsSelection = true; - OptionsTableViewController.View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - } - - UppercaseCell.Switch.On = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorUppercase, true); - LowercaseCell.Switch.On = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorLowercase, true); - SpecialCell.Switch.On = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorSpecial, true); - NumbersCell.Switch.On = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorNumbers, true); - MinNumbersCell.Value = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorMinNumbers, 1); - MinSpecialCell.Value = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorMinSpecial, 1); - LengthCell.Value = _settings.GetValueOrDefault(App.Constants.PasswordGeneratorLength, 10); - - UppercaseCell.ValueChanged += Options_ValueChanged; - LowercaseCell.ValueChanged += Options_ValueChanged; - NumbersCell.ValueChanged += Options_ValueChanged; - SpecialCell.ValueChanged += Options_ValueChanged; - MinNumbersCell.ValueChanged += Options_ValueChanged; - MinSpecialCell.ValueChanged += Options_ValueChanged; - LengthCell.ValueChanged += Options_ValueChanged; - - // Adjust based on context password options - if(PasswordOptions != null) - { - if(PasswordOptions.RequireDigits) - { - NumbersCell.Switch.On = true; - NumbersCell.Switch.Enabled = false; - - if(MinNumbersCell.Value < 1) - { - MinNumbersCell.Value = 1; - } - - MinNumbersCell.Stepper.MinimumValue = 1; - } - - if(PasswordOptions.RequireSymbols) - { - SpecialCell.Switch.On = true; - SpecialCell.Switch.Enabled = false; - - if(MinSpecialCell.Value < 1) - { - MinSpecialCell.Value = 1; - } - - MinSpecialCell.Stepper.MinimumValue = 1; - } - - if(PasswordOptions.MinLength < PasswordOptions.MaxLength) - { - if(PasswordOptions.MinLength > 0 && PasswordOptions.MinLength > LengthCell.Slider.MinValue) - { - if(LengthCell.Value < PasswordOptions.MinLength) - { - LengthCell.Slider.Value = PasswordOptions.MinLength; - } - - LengthCell.Slider.MinValue = PasswordOptions.MinLength; - } - - if(PasswordOptions.MaxLength > 5 && PasswordOptions.MaxLength < LengthCell.Slider.MaxValue) - { - if(LengthCell.Value > PasswordOptions.MaxLength) - { - LengthCell.Slider.Value = PasswordOptions.MaxLength; - } - - LengthCell.Slider.MaxValue = PasswordOptions.MaxLength; - } - } - } - - GeneratePassword(); - if(_isAutofill) - { - GoogleAnalyticsService.TrackAutofillExtensionEvent("GeneratedPassword"); - } - else - { - GoogleAnalyticsService.TrackExtensionEvent("GeneratedPassword"); - } - base.ViewDidLoad(); - } - - private void Options_ValueChanged(object sender, EventArgs e) - { - if(InvalidState()) - { - LowercaseCell.Switch.On = true; - } - - GeneratePassword(); - } - - private bool InvalidState() - { - return !LowercaseCell.Switch.On && !UppercaseCell.Switch.On && !NumbersCell.Switch.On && !SpecialCell.Switch.On; - } - - private void GeneratePassword() - { - BasePasswordLabel.Text = _passwordGenerationService.GeneratePassword( - length: LengthCell.Value, - uppercase: UppercaseCell.Switch.On, - lowercase: LowercaseCell.Switch.On, - numbers: NumbersCell.Switch.On, - special: SpecialCell.Switch.On, - minSpecial: MinSpecialCell.Value, - minNumbers: MinNumbersCell.Value); - } - - public class TableSource : UITableViewSource - { - private PasswordGeneratorViewController _controller; - - public TableSource(PasswordGeneratorViewController controller) - { - _controller = controller; - } - - public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) - { - if(indexPath.Section == 0) - { - var cell = new UITableViewCell(); - cell.TextLabel.TextColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f); - if(indexPath.Row == 0) - { - cell.TextLabel.Text = AppResources.RegeneratePassword; - } - else if(indexPath.Row == 1) - { - cell.TextLabel.Text = AppResources.CopyPassword; - } - return cell; - } - - if(indexPath.Row == 0) - { - return _controller.LengthCell; - } - else if(indexPath.Row == 1) - { - return _controller.UppercaseCell; - } - else if(indexPath.Row == 2) - { - return _controller.LowercaseCell; - } - else if(indexPath.Row == 3) - { - return _controller.NumbersCell; - } - else if(indexPath.Row == 4) - { - return _controller.SpecialCell; - } - else if(indexPath.Row == 5) - { - return _controller.MinNumbersCell; - } - else if(indexPath.Row == 6) - { - return _controller.MinSpecialCell; - } - - return new UITableViewCell(); - } - - public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) - { - return UITableView.AutomaticDimension; - } - - public override nint NumberOfSections(UITableView tableView) - { - return 2; - } - - public override nint RowsInSection(UITableView tableview, nint section) - { - if(section == 0) - { - return 2; - } - - return 7; - } - - public override nfloat GetHeightForHeader(UITableView tableView, nint section) - { - if(section == 0) - { - return 0.00001f; - } - - return UITableView.AutomaticDimension; - } - - public override UIView GetViewForHeader(UITableView tableView, nint section) - { - if(section == 0) - { - return new UIView(CGRect.Empty) - { - Hidden = true - }; - } - - return null; - } - - public override string TitleForHeader(UITableView tableView, nint section) - { - if(section == 1) - { - return AppResources.Options; - } - - return null; - } - - public override string TitleForFooter(UITableView tableView, nint section) - { - if(section == 1) - { - return AppResources.OptionDefaults; - } - - return null; - } - - public override void RowSelected(UITableView tableView, NSIndexPath indexPath) - { - if(indexPath.Section == 0) - { - if(indexPath.Row == 0) - { - if(_controller._isAutofill) - { - _controller.GoogleAnalyticsService.TrackAutofillExtensionEvent("RegeneratedPassword"); - } - else - { - _controller.GoogleAnalyticsService.TrackExtensionEvent("RegeneratedPassword"); - } - _controller.GeneratePassword(); - } - else if(indexPath.Row == 1) - { - if(_controller._isAutofill) - { - _controller.GoogleAnalyticsService.TrackAutofillExtensionEvent("CopiedGeneratedPassword"); - } - else - { - _controller.GoogleAnalyticsService.TrackExtensionEvent("CopiedGeneratedPassword"); - } - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = _controller.BasePasswordLabel.Text; - var alert = Dialogs.CreateMessageAlert(AppResources.Copied); - _controller.PresentViewController(alert, true, () => - { - _controller.DismissViewController(true, null); - }); - } - } - - tableView.DeselectRow(indexPath, true); - tableView.EndEditing(true); - } - - public NSDate DateTimeToNSDate(DateTime date) - { - DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime( - new DateTime(2001, 1, 1, 0, 0, 0)); - return NSDate.FromTimeIntervalSinceReferenceDate( - (date - reference).TotalSeconds); - } - } - } -} diff --git a/src/iOS.Core/HockeyAppCrashManagerDelegate.cs b/src/iOS.Core/HockeyAppCrashManagerDelegate.cs deleted file mode 100644 index 4016f5ce8..000000000 --- a/src/iOS.Core/HockeyAppCrashManagerDelegate.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Bit.App.Abstractions; -using HockeyApp.iOS; -using Newtonsoft.Json; - -namespace Bit.iOS.Core -{ - public class HockeyAppCrashManagerDelegate : BITCrashManagerDelegate - { - private readonly IAppIdService _appIdService; - private readonly IAuthService _authService; - - public HockeyAppCrashManagerDelegate( - IAppIdService appIdService, - IAuthService authService) - { - _appIdService = appIdService; - _authService = authService; - } - - public override string ApplicationLogForCrashManager(BITCrashManager crashManager) - { - var log = new - { - AppId = _appIdService.AppId, - UserId = _authService.UserId - }; - - return JsonConvert.SerializeObject(log, Formatting.Indented); - } - } -} diff --git a/src/iOS.Core/Models/AppExtensionContext.cs b/src/iOS.Core/Models/AppExtensionContext.cs deleted file mode 100644 index e55377fdc..000000000 --- a/src/iOS.Core/Models/AppExtensionContext.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; - -namespace Bit.iOS.Core.Models -{ - public class AppExtensionContext - { - private string _uriString; - - public Uri Uri - { - get - { - Uri uri; - if(string.IsNullOrWhiteSpace(UrlString) || !Uri.TryCreate(UrlString, UriKind.Absolute, out uri)) - { - return null; - } - - return uri; - } - } - public string UrlString - { - get - { - return _uriString; - } - set - { - _uriString = value; - if(string.IsNullOrWhiteSpace(_uriString)) - { - return; - } - - if(!_uriString.StartsWith(App.Constants.iOSAppProtocol) && _uriString.Contains(".")) - { - if(!_uriString.Contains("://") && !_uriString.Contains(" ")) - { - _uriString = string.Concat("http://", _uriString); - } - } - - if(!_uriString.StartsWith("http") && !_uriString.StartsWith(App.Constants.iOSAppProtocol)) - { - _uriString = string.Concat(App.Constants.iOSAppProtocol, _uriString); - } - } - } - public PasswordGenerationOptions PasswordOptions { get; set; } - } -} \ No newline at end of file diff --git a/src/iOS.Core/Models/CipherViewModel.cs b/src/iOS.Core/Models/CipherViewModel.cs deleted file mode 100644 index 869ddc28f..000000000 --- a/src/iOS.Core/Models/CipherViewModel.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Bit.App.Enums; -using Bit.App.Models; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Bit.iOS.Core.Models -{ - public class CipherViewModel - { - public CipherViewModel(Cipher cipher) - { - Id = cipher.Id; - Name = cipher.Name?.Decrypt(cipher.OrganizationId); - Username = cipher.Login?.Username?.Decrypt(cipher.OrganizationId); - Password = cipher.Login?.Password?.Decrypt(cipher.OrganizationId); - Uris = cipher.Login?.Uris?.Select(u => new LoginUriModel(u, cipher.OrganizationId)); - Totp = new Lazy(() => cipher.Login?.Totp?.Decrypt(cipher.OrganizationId)); - Fields = new Lazy>>(() => - { - if(!cipher.Fields?.Any() ?? true) - { - return null; - } - - var fields = new List>(); - foreach(var field in cipher.Fields) - { - fields.Add(new Tuple( - field.Name?.Decrypt(cipher.OrganizationId), - field.Value?.Decrypt(cipher.OrganizationId))); - } - return fields; - }); - } - - public string Id { get; set; } - public string Name { get; set; } - public string Username { get; set; } - public string Password { get; set; } - public IEnumerable Uris { get; set; } - public Lazy Totp { get; set; } - public Lazy>> Fields { get; set; } - - public class LoginUriModel - { - public LoginUriModel(LoginUri data, string orgId) - { - Uri = data?.Uri?.Decrypt(orgId); - Match = data?.Match; - } - - public string Uri { get; set; } - public UriMatchType? Match { get; set; } - } - } -} diff --git a/src/iOS.Core/Models/PasswordGenerationOptions.cs b/src/iOS.Core/Models/PasswordGenerationOptions.cs deleted file mode 100644 index 4c2aa0c8b..000000000 --- a/src/iOS.Core/Models/PasswordGenerationOptions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Bit.iOS.Core.Models -{ - public class PasswordGenerationOptions - { - public int MinLength { get; set; } - public int MaxLength { get; set; } - public bool RequireDigits { get; set; } - public bool RequireSymbols { get; set; } - public string ForbiddenCharacters { get; set; } - } -} diff --git a/src/iOS.Core/Properties/AssemblyInfo.cs b/src/iOS.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index 5fd5acd93..000000000 --- a/src/iOS.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BitwardeniOSCore")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("8bit Solutions LLC")] -[assembly: AssemblyProduct("Bitwarden")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b2538ada-b605-4d6f-acd2-62a409680f84")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/iOS.Core/Services/AppInfoService.cs b/src/iOS.Core/Services/AppInfoService.cs deleted file mode 100644 index 090a57456..000000000 --- a/src/iOS.Core/Services/AppInfoService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Bit.App.Abstractions; -using Foundation; - -namespace Bit.iOS.Core.Services -{ - public class AppInfoService : IAppInfoService - { - public string Build => NSBundle.MainBundle.InfoDictionary["CFBundleVersion"].ToString(); - public string Version => NSBundle.MainBundle.InfoDictionary["CFBundleShortVersionString"].ToString(); - public bool AutofillAccessibilityServiceEnabled => false; - public bool AutofillServiceEnabled => false; - } -} diff --git a/src/iOS.Core/Services/CommonCryptoKeyDerivationService.cs b/src/iOS.Core/Services/CommonCryptoKeyDerivationService.cs deleted file mode 100644 index 8f296adab..000000000 --- a/src/iOS.Core/Services/CommonCryptoKeyDerivationService.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Bit.App.Abstractions; -using Foundation; -using System; -using System.Runtime.InteropServices; - -namespace Bit.iOS.Core.Services -{ - public class CommonCryptoKeyDerivationService : IKeyDerivationService - { - private const uint PBKDFAlgorithm = 2; // PBKDF2 - private const uint PseudoRandomAlgorithm = 3; // SHA256 - private const uint KeyLength = 32; // 256 bit - - public byte[] DeriveKey(byte[] password, byte[] salt, uint rounds) - { - var passwordData = NSData.FromArray(password); - var saltData = NSData.FromArray(salt); - - var keyData = new NSMutableData(); - keyData.Length = KeyLength; - var result = CCKeyCerivationPBKDF(PBKDFAlgorithm, passwordData.Bytes, passwordData.Length, saltData.Bytes, - saltData.Length, PseudoRandomAlgorithm, rounds, keyData.MutableBytes, keyData.Length); - - byte[] keyBytes = new byte[keyData.Length]; - Marshal.Copy(keyData.Bytes, keyBytes, 0, Convert.ToInt32(keyData.Length)); - return keyBytes; - } - - // ref: http://opensource.apple.com//source/CommonCrypto/CommonCrypto-55010/CommonCrypto/CommonKeyDerivation.h - [DllImport(ObjCRuntime.Constants.libSystemLibrary, EntryPoint = "CCKeyDerivationPBKDF")] - private extern static int CCKeyCerivationPBKDF(uint algorithm, IntPtr password, nuint passwordLen, - IntPtr salt, nuint saltLen, uint prf, nuint rounds, IntPtr derivedKey, nuint derivedKeyLength); - } -} diff --git a/src/iOS.Core/Services/DeviceInfoService.cs b/src/iOS.Core/Services/DeviceInfoService.cs deleted file mode 100644 index e51ff1f0a..000000000 --- a/src/iOS.Core/Services/DeviceInfoService.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Bit.App.Abstractions; -using Foundation; -using LocalAuthentication; -using UIKit; - -namespace Bit.iOS.Core.Services -{ - public class DeviceInfoService : IDeviceInfoService - { - public DeviceInfoService() - : this(false) - { } - - public DeviceInfoService(bool isExtension) - { - IsExtension = isExtension; - } - - public string Type => Xamarin.Forms.Device.iOS; - public string Model => UIDevice.CurrentDevice.Model; - public int Version - { - get - { - var versionParts = UIDevice.CurrentDevice.SystemVersion.Split('.'); - if(versionParts.Length > 0 && int.TryParse(versionParts[0], out int version)) - { - return version; - } - - // unable to determine version - return -1; - } - } - public float Scale => (float)UIScreen.MainScreen.Scale; - public bool NfcEnabled => CoreNFC.NFCNdefReaderSession.ReadingAvailable; - public bool HasCamera => true; - public bool AutofillServiceSupported => false; - public bool HasFaceIdSupport - { - get - { - if(Version < 11) - { - return false; - } - - var context = new LAContext(); - if(!context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out NSError e)) - { - return false; - } - - return context.BiometryType == LABiometryType.FaceId; - } - } - public bool IsExtension { get; private set; } - } -} diff --git a/src/iOS.Core/Services/GoogleAnalyticsService.cs b/src/iOS.Core/Services/GoogleAnalyticsService.cs deleted file mode 100644 index a8eb843ec..000000000 --- a/src/iOS.Core/Services/GoogleAnalyticsService.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Bit.App.Abstractions; -using Plugin.Settings.Abstractions; - -namespace Bit.iOS.Core.Services -{ - public class GoogleAnalyticsService : IGoogleAnalyticsService - { - public GoogleAnalyticsService( - IAppIdService appIdService, - ISettings settings) - {} - - public void TrackAppEvent(string eventName, string label = null) - { - } - - public void TrackExtensionEvent(string eventName, string label = null) - { - } - - public void TrackAutofillExtensionEvent(string eventName, string label = null) - { - } - - public void TrackEvent(string category, string eventName, string label = null) - { - } - - public void TrackException(string message, bool fatal) - { - } - - public void TrackPage(string pageName) - { - } - - public void Dispatch(Action completionHandler = null) - { - completionHandler?.Invoke(); - } - - public void SetAppOptOut(bool optOut) - { - } - } -} diff --git a/src/iOS.Core/Services/HttpService.cs b/src/iOS.Core/Services/HttpService.cs deleted file mode 100644 index e1c2c5128..000000000 --- a/src/iOS.Core/Services/HttpService.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Bit.App; -using Bit.App.Abstractions; - -namespace Bit.iOS.Core.Services -{ - public class HttpService : IHttpService - { - public ApiHttpClient ApiClient => new ApiHttpClient(); - public IdentityHttpClient IdentityClient => new IdentityHttpClient(); - } -} diff --git a/src/iOS.Core/Services/KeyChainStorageService.cs b/src/iOS.Core/Services/KeyChainStorageService.cs deleted file mode 100644 index c646a43ff..000000000 --- a/src/iOS.Core/Services/KeyChainStorageService.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using Bit.App.Abstractions; -using Foundation; -using Security; - -namespace Bit.iOS.Core.Services -{ - public class KeyChainStorageService : ISecureStorageService - { - public void Store(string key, byte[] dataBytes) - { - using(var data = NSData.FromArray(dataBytes)) - using(var newRecord = GetKeyRecord(key, data)) - { - Delete(key); - CheckError(SecKeyChain.Add(newRecord)); - } - } - - public byte[] Retrieve(string key) - { - SecStatusCode resultCode; - - using(var existingRecord = GetKeyRecord(key)) - using(var record = SecKeyChain.QueryAsRecord(existingRecord, out resultCode)) - { - if(resultCode == SecStatusCode.ItemNotFound) - { - return null; - } - - CheckError(resultCode); - return record.Generic.ToArray(); - } - } - - public void Delete(string key) - { - using(var record = GetExistingRecord(key)) - { - if(record != null) - { - CheckError(SecKeyChain.Remove(record)); - } - } - } - - public bool Contains(string key) - { - using(var existingRecord = GetExistingRecord(key)) - { - return existingRecord != null; - } - } - - private static void CheckError(SecStatusCode resultCode, [CallerMemberName] string caller = null) - { - if(resultCode != SecStatusCode.Success) - { - throw new Exception(string.Format("Failed to execute {0}. Result code: {1}", caller, resultCode)); - } - } - - private static SecRecord GetKeyRecord(string key, NSData data = null) - { - var record = new SecRecord(SecKind.GenericPassword) - { - Service = "com.8bit.bitwarden", - Account = key, - AccessGroup = "LTZ2PFU5D6.com.8bit.bitwarden" - }; - - if(data != null) - { - record.Generic = data; - } - - return record; - } - - private static SecRecord GetExistingRecord(string key) - { - var existingRecord = GetKeyRecord(key); - - SecStatusCode resultCode; - SecKeyChain.QueryAsRecord(existingRecord, out resultCode); - - return resultCode == SecStatusCode.Success ? existingRecord : null; - } - } -} diff --git a/src/iOS.Core/Services/LocalizeService.cs b/src/iOS.Core/Services/LocalizeService.cs deleted file mode 100644 index 28fab5b96..000000000 --- a/src/iOS.Core/Services/LocalizeService.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Globalization; -using System.Threading; -using Foundation; -using Bit.App.Abstractions; -using Bit.App.Models; - -namespace Bit.iOS.Core.Services -{ - public class LocalizeService : ILocalizeService - { - public void SetLocale(CultureInfo ci) - { - Thread.CurrentThread.CurrentCulture = ci; - Thread.CurrentThread.CurrentUICulture = ci; - Console.WriteLine("CurrentCulture set: " + ci.Name); - } - - public CultureInfo GetCurrentCultureInfo() - { - var netLanguage = "en"; - if(NSLocale.PreferredLanguages.Length > 0) - { - var pref = NSLocale.PreferredLanguages[0]; - - netLanguage = iOSToDotnetLanguage(pref); - } - - // this gets called a lot - try/catch can be expensive so consider caching or something - CultureInfo ci = null; - try - { - ci = new CultureInfo(netLanguage); - } - catch(CultureNotFoundException e1) - { - // iOS locale not valid .NET culture (eg. "en-ES" : English in Spain) - // fallback to first characters, in this case "en" - try - { - var fallback = ToDotnetFallbackLanguage(new PlatformCulture(netLanguage)); - Console.WriteLine(netLanguage + " failed, trying " + fallback + " (" + e1.Message + ")"); - ci = new CultureInfo(fallback); - } - catch(CultureNotFoundException e2) - { - // iOS language not valid .NET culture, falling back to English - Console.WriteLine(netLanguage + " couldn't be set, using 'en' (" + e2.Message + ")"); - ci = new CultureInfo("en"); - } - } - - return ci; - } - - private string iOSToDotnetLanguage(string iOSLanguage) - { - Console.WriteLine("iOS Language:" + iOSLanguage); - var netLanguage = iOSLanguage; - - if(iOSLanguage.StartsWith("zh-Hant") || iOSLanguage.StartsWith("zh-HK")) - { - netLanguage = "zh-Hant"; - } - else if(iOSLanguage.StartsWith("zh")) - { - netLanguage = "zh-Hans"; - } - else - { - //certain languages need to be converted to CultureInfo equivalent - switch(iOSLanguage) - { - case "ms-MY": // "Malaysian (Malaysia)" not supported .NET culture - case "ms-SG": // "Malaysian (Singapore)" not supported .NET culture - netLanguage = "ms"; // closest supported - break; - case "gsw-CH": // "Schwiizertüütsch (Swiss German)" not supported .NET culture - netLanguage = "de-CH"; // closest supported - break; - // add more application-specific cases here (if required) - // ONLY use cultures that have been tested and known to work - } - } - - Console.WriteLine(".NET Language/Locale:" + netLanguage); - return netLanguage; - } - - private string ToDotnetFallbackLanguage(PlatformCulture platCulture) - { - Console.WriteLine(".NET Fallback Language:" + platCulture.LanguageCode); - var netLanguage = platCulture.LanguageCode; // use the first part of the identifier (two chars, usually); - - switch(platCulture.LanguageCode) - { - case "pt": - netLanguage = "pt-PT"; // fallback to Portuguese (Portugal) - break; - case "gsw": - netLanguage = "de-CH"; // equivalent to German (Switzerland) for this app - break; - // add more application-specific cases here (if required) - // ONLY use cultures that have been tested and known to work - } - - Console.WriteLine(".NET Fallback Language/Locale:" + netLanguage + " (application-specific)"); - return netLanguage; - } - } -} diff --git a/src/iOS.Core/Services/LogService.cs b/src/iOS.Core/Services/LogService.cs deleted file mode 100644 index e5c9b8131..000000000 --- a/src/iOS.Core/Services/LogService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using Bit.App.Abstractions; - -namespace Bit.iOS.Core.Services -{ - public class LogService : ILogService - { - public void WriteLine(string message) - { - Console.WriteLine(message); - } - } -} diff --git a/src/iOS.Core/Services/NoopDeviceActionService.cs b/src/iOS.Core/Services/NoopDeviceActionService.cs deleted file mode 100644 index 36f35b20c..000000000 --- a/src/iOS.Core/Services/NoopDeviceActionService.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using Bit.App.Abstractions; -using System.Threading.Tasks; -using Bit.App.Models.Page; -using Xamarin.Forms; - -namespace Bit.iOS.Core.Services -{ - public class NoopDeviceActionService : IDeviceActionService - { - public void Autofill(VaultListPageModel.Cipher cipher) - { - // do nothing - } - - public void Background() - { - // do nothing - } - - public bool CanOpenFile(string fileName) - { - return false; - } - - public void ClearCache() - { - // do nothing - } - - public void CloseAutofill() - { - // do nothing - } - - public void CopyToClipboard(string text) - { - // do nothing - } - - public void DismissKeyboard() - { - // do nothing - } - - public Task DisplayAlertAsync(string title, string message, string cancel, params string[] buttons) - { - return Task.FromResult(null); - } - - public Task DisplayPromptAync(string title = null, string description = null, string text = null) - { - return Task.FromResult(null); - } - - public Task HideLoadingAsync() - { - return Task.FromResult(0); - } - - public Task LaunchAppAsync(string appName, Page page) - { - return Task.FromResult(0); - } - - public void OpenAccessibilitySettings() - { - // do nothing - } - - public void OpenAutofillSettings() - { - // do nothing - } - - public bool OpenFile(byte[] fileData, string id, string fileName) - { - return false; - } - - public void RateApp() - { - // do nothing - } - - public Task SelectFileAsync() - { - return Task.FromResult(0); - } - - public Task ShowLoadingAsync(string text) - { - return Task.FromResult(0); - } - - public void Toast(string text, bool longDuration = false) - { - // do nothing - } - } -} diff --git a/src/iOS.Core/Services/Settings.cs b/src/iOS.Core/Services/Settings.cs deleted file mode 100644 index 2d36bab01..000000000 --- a/src/iOS.Core/Services/Settings.cs +++ /dev/null @@ -1,495 +0,0 @@ -using System; -using Foundation; -#if __IOS__ -using UIKit; -#endif -using Plugin.Settings.Abstractions; - -namespace Bit.iOS.Core.Services -{ - ///

- /// Main implementation for ISettings - /// - [Preserve(AllMembers = true)] - public class Settings : ISettings - { - private readonly object locker = new object(); - private readonly string _defaultsName; - - public Settings(string defaultsName) - { - _defaultsName = defaultsName; - } - - /// - /// Gets the current value or the default that you specify. - /// - /// Vaue of t (bool, int, float, long, string) - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - T GetValueOrDefaultInternal(string key, T defaultValue = default(T), string fileName = null) - { - lock(locker) - { - var defaults = GetUserDefaults(fileName); - - if(defaults[key] == null) - return defaultValue; - - Type typeOf = typeof(T); - if(typeOf.IsGenericType && typeOf.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - typeOf = Nullable.GetUnderlyingType(typeOf); - } - object value = null; - var typeCode = Type.GetTypeCode(typeOf); - switch(typeCode) - { - case TypeCode.Decimal: - var savedDecimal = defaults.StringForKey(key); - value = Convert.ToDecimal(savedDecimal, System.Globalization.CultureInfo.InvariantCulture); - break; - case TypeCode.Boolean: - value = defaults.BoolForKey(key); - break; - case TypeCode.Int64: - var savedInt64 = defaults.StringForKey(key); - value = Convert.ToInt64(savedInt64, System.Globalization.CultureInfo.InvariantCulture); - break; - case TypeCode.Double: - value = defaults.DoubleForKey(key); - break; - case TypeCode.String: - value = defaults.StringForKey(key); - break; - case TypeCode.Int32: - value = (Int32)defaults.IntForKey(key); - break; - case TypeCode.Single: - value = defaults.FloatForKey(key); - break; - - case TypeCode.DateTime: - var savedTime = defaults.StringForKey(key); - if(string.IsNullOrWhiteSpace(savedTime)) - { - value = defaultValue; - } - else - { - var ticks = Convert.ToInt64(savedTime, System.Globalization.CultureInfo.InvariantCulture); - if(ticks >= 0) - { - //Old value, stored before update to UTC values - value = new DateTime(ticks); - } - else - { - //New value, UTC - value = new DateTime(-ticks, DateTimeKind.Utc); - } - } - break; - default: - - if(defaultValue is Guid) - { - var outGuid = Guid.Empty; - var savedGuid = defaults.StringForKey(key); - if(string.IsNullOrWhiteSpace(savedGuid)) - { - value = outGuid; - } - else - { - Guid.TryParse(savedGuid, out outGuid); - value = outGuid; - } - } - else - { - throw new ArgumentException($"Value of type {typeCode} is not supported."); - } - - break; - } - - - return null != value ? (T)value : defaultValue; - } - } - - /// - /// Adds or updates a value - /// - /// key to update - /// value to set - /// Name of file for settings to be stored and retrieved - /// True if added or update and you need to save - bool AddOrUpdateValueInternal(string key, T value, string fileName = null) - { - if(value == null) - { - Remove(key, fileName); - return true; - } - - Type typeOf = typeof(T); - if(typeOf.IsGenericType && typeOf.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - typeOf = Nullable.GetUnderlyingType(typeOf); - } - var typeCode = Type.GetTypeCode(typeOf); - return AddOrUpdateValueCore(key, value, typeCode, fileName); - } - - bool AddOrUpdateValueCore(string key, object value, TypeCode typeCode, string fileName) - { - lock(locker) - { - var defaults = GetUserDefaults(fileName); - switch(typeCode) - { - case TypeCode.Decimal: - defaults.SetString(Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture), key); - break; - case TypeCode.Boolean: - defaults.SetBool(Convert.ToBoolean(value), key); - break; - case TypeCode.Int64: - defaults.SetString(Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture), key); - break; - case TypeCode.Double: - defaults.SetDouble(Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture), key); - break; - case TypeCode.String: - defaults.SetString(Convert.ToString(value), key); - break; - case TypeCode.Int32: - defaults.SetInt(Convert.ToInt32(value, System.Globalization.CultureInfo.InvariantCulture), key); - break; - case TypeCode.Single: - defaults.SetFloat(Convert.ToSingle(value, System.Globalization.CultureInfo.InvariantCulture), key); - break; - case TypeCode.DateTime: - defaults.SetString(Convert.ToString(-(Convert.ToDateTime(value)).ToUniversalTime().Ticks), key); - break; - default: - if(value is Guid) - { - if(value == null) - value = Guid.Empty; - - defaults.SetString(((Guid)value).ToString(), key); - } - else - { - throw new ArgumentException($"Value of type {typeCode} is not supported."); - } - break; - } - try - { - defaults.Synchronize(); - } - catch(Exception ex) - { - Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message); - } - } - - - return true; - } - - /// - /// Removes a desired key from the settings - /// - /// Key for setting - /// Name of file for settings to be stored and retrieved - public void Remove(string key, string fileName = null) - { - lock(locker) - { - var defaults = GetUserDefaults(fileName); - try - { - if(defaults[key] != null) - { - defaults.RemoveObject(key); - defaults.Synchronize(); - } - } - catch(Exception ex) - { - Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message); - } - } - } - - /// - /// Clear all keys from settings - /// - /// Name of file for settings to be stored and retrieved - public void Clear(string fileName = null) - { - lock(locker) - { - var defaults = GetUserDefaults(fileName); - try - { - var items = defaults.ToDictionary(); - - foreach(var item in items.Keys) - { - if(item is NSString nsString) - defaults.RemoveObject(nsString); - } - defaults.Synchronize(); - } - catch(Exception ex) - { - Console.WriteLine("Unable to clear all defaults. Message: " + ex.Message); - } - } - } - - /// - /// Checks to see if the key has been added. - /// - /// Key to check - /// Name of file for settings to be stored and retrieved - /// True if contains key, else false - public bool Contains(string key, string fileName = null) - { - lock(locker) - { - var defaults = GetUserDefaults(fileName); - try - { - var setting = defaults[key]; - return setting != null; - } - catch(Exception ex) - { - Console.WriteLine("Unable to clear all defaults. Message: " + ex.Message); - } - - return false; - } - } - - NSUserDefaults GetUserDefaults(string fileName = null) - { - if(string.IsNullOrWhiteSpace(fileName) && !string.IsNullOrWhiteSpace(_defaultsName)) - { - return new NSUserDefaults(_defaultsName, NSUserDefaultsType.SuiteName); - } - - return string.IsNullOrWhiteSpace(fileName) ? - NSUserDefaults.StandardUserDefaults : - new NSUserDefaults(fileName, NSUserDefaultsType.SuiteName); - } - - - - #region GetValueOrDefault - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public decimal GetValueOrDefault(string key, decimal defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public bool GetValueOrDefault(string key, bool defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public long GetValueOrDefault(string key, long defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public string GetValueOrDefault(string key, string defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public int GetValueOrDefault(string key, int defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public float GetValueOrDefault(string key, float defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public DateTime GetValueOrDefault(string key, DateTime defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public Guid GetValueOrDefault(string key, Guid defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - /// - /// Gets the current value or the default that you specify. - /// - /// Key for settings - /// default value if not set - /// Name of file for settings to be stored and retrieved - /// Value or default - public double GetValueOrDefault(string key, double defaultValue, string fileName = null) => - GetValueOrDefaultInternal(key, defaultValue, fileName); - #endregion - - #region AddOrUpdateValue - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, decimal value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, bool value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, long value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, string value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, int value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, float value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, DateTime value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, Guid value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - /// - /// Adds or updates the value - /// - /// Key for settting - /// Value to set - /// Name of file for settings to be stored and retrieved - /// True of was added or updated and you need to save it. - public bool AddOrUpdateValue(string key, double value, string fileName = null) => - AddOrUpdateValueInternal(key, value, fileName); - - #endregion - - - /// - /// Attempts to open the app settings page. - /// - /// true if success, else false and not supported - public bool OpenAppSettings() - { -#if __IOS__ - //Opening settings only open in iOS 8+ - if(!UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) - return false; - - try - { - UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString)); - return true; - } - catch - { - return false; - } -#else - return false; -#endif - } - - } - -} \ No newline at end of file diff --git a/src/iOS.Core/Services/SqlService.cs b/src/iOS.Core/Services/SqlService.cs deleted file mode 100644 index 570e834f9..000000000 --- a/src/iOS.Core/Services/SqlService.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.IO; -using Bit.App.Abstractions; -using Foundation; -using SQLite; - -namespace Bit.iOS.Core.Services -{ - public class SqlService : ISqlService - { - private SQLiteConnection _connection; - - public SQLiteConnection GetConnection() - { - if(_connection != null) - { - return _connection; - } - - var sqliteFilename = "bitwarden.db3"; - var fileManager = new NSFileManager(); - var appGroupContainer = fileManager.GetContainerUrl("group.com.8bit.bitwarden"); - var libraryPath = Path.Combine(appGroupContainer.Path, "Library"); // Library folder - var path = Path.Combine(libraryPath, sqliteFilename); - Console.WriteLine(path); - - _connection = new SQLiteConnection(path, - SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.FullMutex | SQLiteOpenFlags.SharedCache); - return _connection; - } - } -} diff --git a/src/iOS.Core/Utilities/ASHelpers.cs b/src/iOS.Core/Utilities/ASHelpers.cs deleted file mode 100644 index ac1692270..000000000 --- a/src/iOS.Core/Utilities/ASHelpers.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AuthenticationServices; -using Bit.App.Abstractions; -using Bit.App.Models; - -namespace Bit.iOS.Core.Utilities -{ - public static class ASHelpers - { - public static async Task ReplaceAllIdentities(ICipherService cipherService) - { - if (await AutofillEnabled()) - { - var identities = new List(); - var ciphers = await cipherService.GetAllAsync(); - foreach (var cipher in ciphers) - { - var identity = ToCredentialIdentity(cipher); - if (identity != null) - { - identities.Add(identity); - } - } - if (identities.Any()) - { - await ASCredentialIdentityStore.SharedStore?.ReplaceCredentialIdentitiesAsync(identities.ToArray()); - } - } - } - - public static async Task IdentitiesCanIncremental() - { - var state = await ASCredentialIdentityStore.SharedStore?.GetCredentialIdentityStoreStateAsync(); - return state != null && state.Enabled && state.SupportsIncrementalUpdates; - } - - public static async Task AutofillEnabled() - { - var state = await ASCredentialIdentityStore.SharedStore?.GetCredentialIdentityStoreStateAsync(); - return state != null && state.Enabled; - } - - public static async Task GetCipherIdentityAsync(string cipherId, ICipherService cipherService) - { - var cipher = await cipherService.GetByIdAsync(cipherId); - return ToCredentialIdentity(cipher); - } - - public static ASPasswordCredentialIdentity ToCredentialIdentity(Cipher cipher) - { - if (!cipher?.Login?.Uris?.Any() ?? true) - { - return null; - } - var uri = cipher.Login.Uris.FirstOrDefault()?.Uri?.Decrypt(cipher.OrganizationId); - if (string.IsNullOrWhiteSpace(uri)) - { - return null; - } - var username = cipher.Login.Username?.Decrypt(cipher.OrganizationId); - if (string.IsNullOrWhiteSpace(username)) - { - return null; - } - var serviceId = new ASCredentialServiceIdentifier(uri, ASCredentialServiceIdentifierType.Url); - return new ASPasswordCredentialIdentity(serviceId, username, cipher.Id); - } - } -} diff --git a/src/iOS.Core/Utilities/Dialogs.cs b/src/iOS.Core/Utilities/Dialogs.cs deleted file mode 100644 index 817013632..000000000 --- a/src/iOS.Core/Utilities/Dialogs.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Drawing; -using CoreGraphics; -using UIKit; - -namespace Bit.iOS.Core.Utilities -{ - public static class Dialogs - { - public static UIAlertController CreateLoadingAlert(string message) - { - var loadingIndicator = new UIActivityIndicatorView(new CGRect(10, 5, 50, 50)); - loadingIndicator.HidesWhenStopped = true; - loadingIndicator.ActivityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray; - loadingIndicator.StartAnimating(); - - var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert); - alert.View.TintColor = UIColor.Black; - alert.View.Add(loadingIndicator); - return alert; - } - - public static UIAlertController CreateMessageAlert(string message) - { - var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert); - alert.View.TintColor = UIColor.Black; - return alert; - } - - public static UIAlertController CreateAlert(string title, string message, string accept, Action acceptHandle = null) - { - var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert); - var oldFrame = alert.View.Frame; - alert.View.Frame = new RectangleF((float)oldFrame.X, (float)oldFrame.Y, (float)oldFrame.Width, (float)oldFrame.Height - 20); - alert.AddAction(UIAlertAction.Create(accept, UIAlertActionStyle.Default, acceptHandle)); - return alert; - } - - public static UIAlertController CreateActionSheet(string title, UIViewController controller) - { - var sheet = UIAlertController.Create(title, null, UIAlertControllerStyle.ActionSheet); - if(UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) - { - var x = controller.View.Bounds.Width / 2; - var y = controller.View.Bounds.Bottom; - var rect = new CGRect(x, y, 0, 0); - - sheet.PopoverPresentationController.SourceView = controller.View; - sheet.PopoverPresentationController.SourceRect = rect; - sheet.PopoverPresentationController.PermittedArrowDirections = UIPopoverArrowDirection.Unknown; - } - return sheet; - } - } -} diff --git a/src/iOS.Core/Views/ExtensionSearchDelegate.cs b/src/iOS.Core/Views/ExtensionSearchDelegate.cs deleted file mode 100644 index 317d55138..000000000 --- a/src/iOS.Core/Views/ExtensionSearchDelegate.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Foundation; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class ExtensionSearchDelegate : UISearchBarDelegate - { - private readonly UITableView _tableView; - private CancellationTokenSource _filterResultsCancellationTokenSource; - - public ExtensionSearchDelegate(UITableView tableView) - { - _tableView = tableView; - } - - public override void TextChanged(UISearchBar searchBar, string searchText) - { - var cts = new CancellationTokenSource(); - Task.Run(() => - { - NSRunLoop.Main.BeginInvokeOnMainThread(async () => - { - if(!string.IsNullOrWhiteSpace(searchText)) - { - await Task.Delay(300); - if(searchText != searchBar.Text) - { - return; - } - else - { - _filterResultsCancellationTokenSource?.Cancel(); - } - } - try - { - ((ExtensionTableSource)_tableView.Source).FilterResults(searchText, cts.Token); - _tableView.ReloadData(); - } - catch(OperationCanceledException) { } - _filterResultsCancellationTokenSource = cts; - }); - }, cts.Token); - } - } -} \ No newline at end of file diff --git a/src/iOS.Core/Views/ExtensionTableSource.cs b/src/iOS.Core/Views/ExtensionTableSource.cs deleted file mode 100644 index 4abcbc8a1..000000000 --- a/src/iOS.Core/Views/ExtensionTableSource.cs +++ /dev/null @@ -1,149 +0,0 @@ -using Bit.App.Abstractions; -using Bit.App.Models; -using Bit.App.Resources; -using Bit.App.Utilities; -using Bit.iOS.Core.Models; -using Foundation; -using Plugin.Settings.Abstractions; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using UIKit; -using XLabs.Ioc; - -namespace Bit.iOS.Core.Views -{ - public class ExtensionTableSource : UITableViewSource - { - private const string CellIdentifier = "TableCell"; - - private IEnumerable _allItems = new List(); - protected ICipherService _cipherService; - protected ISettings _settings; - private bool _accessPremium; - private AppExtensionContext _context; - private UIViewController _controller; - - public ExtensionTableSource(AppExtensionContext context, UIViewController controller) - { - _accessPremium = Helpers.CanAccessPremium(); - _cipherService = Resolver.Resolve(); - _settings = Resolver.Resolve(); - _context = context; - _controller = controller; - } - - public IEnumerable Items { get; private set; } - - public async Task LoadItemsAsync(bool urlFilter = true, string searchFilter = null) - { - var combinedLogins = new List(); - - if(urlFilter) - { - var logins = await _cipherService.GetAllAsync(_context.UrlString); - if(logins?.Item1 != null) - { - combinedLogins.AddRange(logins.Item1); - } - if(logins?.Item2 != null) - { - combinedLogins.AddRange(logins.Item2); - } - } - else - { - var logins = await _cipherService.GetAllAsync(); - combinedLogins.AddRange(logins); - } - - _allItems = combinedLogins - .Where(c => c.Type == App.Enums.CipherType.Login) - .Select(s => new CipherViewModel(s)) - .OrderBy(s => s.Name) - .ThenBy(s => s.Username) - .ToList() ?? new List(); - FilterResults(searchFilter, new CancellationToken()); - } - - public void FilterResults(string searchFilter, CancellationToken ct) - { - ct.ThrowIfCancellationRequested(); - - if(string.IsNullOrWhiteSpace(searchFilter)) - { - Items = _allItems.ToList(); - } - else - { - searchFilter = searchFilter.ToLower(); - Items = _allItems - .Where(s => s.Name?.ToLower().Contains(searchFilter) ?? false || - (s.Username?.ToLower().Contains(searchFilter) ?? false) || - (s.Uris?.FirstOrDefault()?.Uri?.ToLower().Contains(searchFilter) ?? false)) - .TakeWhile(s => !ct.IsCancellationRequested) - .ToArray(); - } - } - - public IEnumerable TableItems { get; set; } - - public override nint RowsInSection(UITableView tableview, nint section) - { - return Items == null || Items.Count() == 0 ? 1 : Items.Count(); - } - - public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) - { - if(Items == null || Items.Count() == 0) - { - var noDataCell = new UITableViewCell(UITableViewCellStyle.Default, "NoDataCell"); - noDataCell.TextLabel.Text = AppResources.NoItemsTap; - noDataCell.TextLabel.TextAlignment = UITextAlignment.Center; - noDataCell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap; - noDataCell.TextLabel.Lines = 0; - return noDataCell; - } - - var cell = tableView.DequeueReusableCell(CellIdentifier); - - // if there are no cells to reuse, create a new one - if(cell == null) - { - Debug.WriteLine("BW Log, Make new cell for list."); - cell = new UITableViewCell(UITableViewCellStyle.Subtitle, CellIdentifier); - cell.DetailTextLabel.TextColor = cell.DetailTextLabel.TintColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); - } - return cell; - } - - public override void WillDisplay(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath) - { - if(Items == null || Items.Count() == 0 || cell == null) - { - return; - } - - var item = Items.ElementAt(indexPath.Row); - cell.TextLabel.Text = item.Name; - cell.DetailTextLabel.Text = item.Username; - } - - public string GetTotp(CipherViewModel item) - { - string totp = null; - if(_accessPremium) - { - if(item != null && !string.IsNullOrWhiteSpace(item.Totp.Value)) - { - totp = Crypto.Totp(item.Totp.Value); - } - } - - return totp; - } - } -} diff --git a/src/iOS.Core/Views/FormEntryTableViewCell.cs b/src/iOS.Core/Views/FormEntryTableViewCell.cs deleted file mode 100644 index 9088e7e0a..000000000 --- a/src/iOS.Core/Views/FormEntryTableViewCell.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class FormEntryTableViewCell : UITableViewCell, ISelectable - { - public FormEntryTableViewCell( - string labelName = null, - bool useTextView = false, - nfloat? height = null, - bool useLabelAsPlaceholder = false) - : base(UITableViewCellStyle.Default, nameof(FormEntryTableViewCell)) - { - var descriptor = UIFontDescriptor.PreferredBody; - var pointSize = descriptor.PointSize; - - if(labelName != null && !useLabelAsPlaceholder) - { - Label = new UILabel - { - Text = labelName, - TranslatesAutoresizingMaskIntoConstraints = false, - Font = UIFont.FromDescriptor(descriptor, 0.8f * pointSize), - TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f) - }; - - ContentView.Add(Label); - } - - if(useTextView) - { - TextView = new UITextView - { - TranslatesAutoresizingMaskIntoConstraints = false, - Font = UIFont.FromDescriptor(descriptor, pointSize) - }; - - ContentView.Add(TextView); - ContentView.AddConstraints(new NSLayoutConstraint[] { - NSLayoutConstraint.Create(TextView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, TextView, NSLayoutAttribute.Trailing, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, TextView, NSLayoutAttribute.Bottom, 1f, 10f) - }); - - if(labelName != null && !useLabelAsPlaceholder) - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, Label, NSLayoutAttribute.Bottom, 1f, 10f)); - } - else - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1f, 10f)); - } - - if(height.HasValue) - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1f, height.Value)); - } - } - else - { - TextField = new UITextField - { - TranslatesAutoresizingMaskIntoConstraints = false, - BorderStyle = UITextBorderStyle.None, - Font = UIFont.FromDescriptor(descriptor, pointSize), - ClearButtonMode = UITextFieldViewMode.WhileEditing - }; - - if(useLabelAsPlaceholder) - { - TextField.Placeholder = labelName; - } - - ContentView.Add(TextField); - ContentView.AddConstraints(new NSLayoutConstraint[] { - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, TextField, NSLayoutAttribute.Trailing, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, TextField, NSLayoutAttribute.Bottom, 1f, 10f) - }); - - if(labelName != null && !useLabelAsPlaceholder) - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Top, NSLayoutRelation.Equal, Label, NSLayoutAttribute.Bottom, 1f, 10f)); - } - else - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1f, 10f)); - } - - if(height.HasValue) - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1f, height.Value)); - } - } - - if(labelName != null && !useLabelAsPlaceholder) - { - ContentView.AddConstraints(new NSLayoutConstraint[] { - NSLayoutConstraint.Create(Label, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1f, 15f), - NSLayoutConstraint.Create(Label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1f, 10f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, Label, NSLayoutAttribute.Trailing, 1f, 15f) - }); - } - } - - public UILabel Label { get; set; } - public UITextField TextField { get; set; } - public UITextView TextView { get; set; } - - public void Select() - { - if(TextView != null) - { - TextView.BecomeFirstResponder(); - } - else if(TextField != null) - { - TextField.BecomeFirstResponder(); - } - } - } -} diff --git a/src/iOS.Core/Views/ISelectable.cs b/src/iOS.Core/Views/ISelectable.cs deleted file mode 100644 index 463d783fd..000000000 --- a/src/iOS.Core/Views/ISelectable.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Bit.iOS.Core.Views -{ - public interface ISelectable - { - void Select(); - } -} diff --git a/src/iOS.Core/Views/PickerTableViewCell.cs b/src/iOS.Core/Views/PickerTableViewCell.cs deleted file mode 100644 index 84094b752..000000000 --- a/src/iOS.Core/Views/PickerTableViewCell.cs +++ /dev/null @@ -1,195 +0,0 @@ -using CoreGraphics; -using System; -using System.Collections.Generic; -using System.Drawing; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class PickerTableViewCell : UITableViewCell, ISelectable - { - private List _items = new List(); - private int _selectedIndex = 0; - - public PickerTableViewCell( - string labelName, - nfloat? height = null) - : base(UITableViewCellStyle.Default, nameof(PickerTableViewCell)) - { - var descriptor = UIFontDescriptor.PreferredBody; - var pointSize = descriptor.PointSize; - - Label = new UILabel - { - Text = labelName, - TranslatesAutoresizingMaskIntoConstraints = false, - Font = UIFont.FromDescriptor(descriptor, 0.8f * pointSize), - TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f) - }; - - ContentView.Add(Label); - - TextField = new NoCaretField - { - BorderStyle = UITextBorderStyle.None, - TranslatesAutoresizingMaskIntoConstraints = false, - Font = UIFont.FromDescriptor(descriptor, pointSize) - }; - - var width = (float)UIScreen.MainScreen.Bounds.Width; - var toolbar = new UIToolbar(new RectangleF(0, 0, width, 44)) - { - BarStyle = UIBarStyle.Default, - Translucent = true - }; - var spacer = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace); - var doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done, (o, a) => - { - var s = (PickerSource)Picker.Model; - if(s.SelectedIndex == -1 && Items != null && Items.Count > 0) - { - UpdatePickerSelectedIndex(0); - } - TextField.Text = s.SelectedItem; - TextField.ResignFirstResponder(); - }); - - toolbar.SetItems(new[] { spacer, doneButton }, false); - - TextField.InputView = Picker; - TextField.InputAccessoryView = toolbar; - - ContentView.Add(TextField); - - ContentView.AddConstraints(new NSLayoutConstraint[] { - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, TextField, NSLayoutAttribute.Trailing, 1f, 15f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, TextField, NSLayoutAttribute.Bottom, 1f, 10f), - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Top, NSLayoutRelation.Equal, Label, NSLayoutAttribute.Bottom, 1f, 10f), - NSLayoutConstraint.Create(Label, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1f, 15f), - NSLayoutConstraint.Create(Label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1f, 10f), - NSLayoutConstraint.Create(ContentView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, Label, NSLayoutAttribute.Trailing, 1f, 15f) - }); - - if(height.HasValue) - { - ContentView.AddConstraint( - NSLayoutConstraint.Create(TextField, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1f, height.Value)); - } - - Picker.Model = new PickerSource(this); - } - - public UITextField TextField { get; set; } - public UILabel Label { get; set; } - public UIPickerView Picker { get; set; } = new UIPickerView(); - - public List Items - { - get { return _items; } - set - { - _items = value; - UpdatePicker(); - } - } - - public int SelectedIndex - { - get { return _selectedIndex; } - set - { - _selectedIndex = value; - UpdatePicker(); - } - } - - public string SelectedItem => TextField.Text; - - private void UpdatePicker() - { - TextField.Text = SelectedIndex == -1 || Items == null ? "" : Items[SelectedIndex]; - Picker.ReloadAllComponents(); - if(Items == null || Items.Count == 0) - { - return; - } - - UpdatePickerSelectedIndex(SelectedIndex); - } - - private void UpdatePickerFromModel(PickerSource s) - { - TextField.Text = s.SelectedItem; - _selectedIndex = s.SelectedIndex; - } - - private void UpdatePickerSelectedIndex(int formsIndex) - { - var source = (PickerSource)Picker.Model; - source.SelectedIndex = formsIndex; - source.SelectedItem = formsIndex >= 0 ? Items[formsIndex] : null; - Picker.Select(Math.Max(formsIndex, 0), 0, true); - } - - public void Select() - { - TextField?.BecomeFirstResponder(); - } - - private class NoCaretField : UITextField - { - public NoCaretField() : base(default(CGRect)) - { } - - public override CGRect GetCaretRectForPosition(UITextPosition position) - { - return default(CGRect); - } - } - - private class PickerSource : UIPickerViewModel - { - private readonly PickerTableViewCell _cell; - - public PickerSource(PickerTableViewCell cell) - { - _cell = cell; - } - - public int SelectedIndex { get; internal set; } - public string SelectedItem { get; internal set; } - - public override nint GetComponentCount(UIPickerView picker) - { - return 1; - } - - public override nint GetRowsInComponent(UIPickerView pickerView, nint component) - { - return _cell.Items != null ? _cell.Items.Count : 0; - } - - public override string GetTitle(UIPickerView picker, nint row, nint component) - { - return _cell.Items[(int)row]; - } - - public override void Selected(UIPickerView picker, nint row, nint component) - { - if(_cell.Items.Count == 0) - { - SelectedItem = null; - SelectedIndex = -1; - } - else - { - SelectedItem = _cell.Items[(int)row]; - SelectedIndex = (int)row; - } - - _cell.UpdatePickerFromModel(this); - } - } - } -} diff --git a/src/iOS.Core/Views/SliderTableViewCell.cs b/src/iOS.Core/Views/SliderTableViewCell.cs deleted file mode 100644 index 30231d2dd..000000000 --- a/src/iOS.Core/Views/SliderTableViewCell.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class SliderTableViewCell : UITableViewCell - { - private string _detailRightSpace = "\t"; - private int _value; - - public SliderTableViewCell(string labelName, int value, int min, int max) - : base(UITableViewCellStyle.Value1, nameof(SwitchTableViewCell)) - { - TextLabel.Text = labelName; - DetailTextLabel.TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); - - Slider = new UISlider - { - MinValue = min, - MaxValue = max, - TintColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f), - Frame = new CoreGraphics.CGRect(0, 0, 180, 30) - }; - Slider.ValueChanged += Slider_ValueChanged; - Value = value; - - AccessoryView = Slider; - } - - private void Slider_ValueChanged(object sender, EventArgs e) - { - var newValue = Convert.ToInt32(Math.Round(Slider.Value, 0)); - bool valueChanged = newValue != Value; - - Value = newValue; - - if(valueChanged) - { - ValueChanged?.Invoke(this, null); - } - } - - public UISlider Slider { get; set; } - public int Value - { - get { return _value; } - set - { - _value = value; - Slider.Value = value; - DetailTextLabel.Text = string.Concat(value.ToString(), _detailRightSpace); - } - } - public event EventHandler ValueChanged; - } -} diff --git a/src/iOS.Core/Views/StepperTableViewCell.cs b/src/iOS.Core/Views/StepperTableViewCell.cs deleted file mode 100644 index 02bdf8ce1..000000000 --- a/src/iOS.Core/Views/StepperTableViewCell.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class StepperTableViewCell : UITableViewCell - { - // Give some space to the right of the detail in between the spacer. - // This is a bit of a hack, but I did not see a way to specify a margin on the - // detaul DetailTextLabel or AccessoryView - private string _detailRightSpace = "\t"; - private int _value; - - public StepperTableViewCell(string labelName, int value, int min, int max, int increment) - : base(UITableViewCellStyle.Value1, nameof(SwitchTableViewCell)) - { - TextLabel.Text = labelName; - DetailTextLabel.TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); - - Stepper = new UIStepper - { - TintColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f), - MinimumValue = min, - MaximumValue = max - }; - Stepper.ValueChanged += Stepper_ValueChanged; - Value = value; - - AccessoryView = Stepper; - } - - private void Stepper_ValueChanged(object sender, EventArgs e) - { - Value = Convert.ToInt32(Stepper.Value); - ValueChanged?.Invoke(this, null); - } - - public UIStepper Stepper { get; private set; } - public int Value - { - get { return _value; } - set - { - _value = value; - Stepper.Value = value; - DetailTextLabel.Text = string.Concat(value.ToString(), _detailRightSpace); - } - } - public event EventHandler ValueChanged; - } -} diff --git a/src/iOS.Core/Views/SwitchTableViewCell.cs b/src/iOS.Core/Views/SwitchTableViewCell.cs deleted file mode 100644 index 9302f89e4..000000000 --- a/src/iOS.Core/Views/SwitchTableViewCell.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class SwitchTableViewCell : UITableViewCell - { - public SwitchTableViewCell(string labelName) - : base(UITableViewCellStyle.Default, nameof(SwitchTableViewCell)) - { - TextLabel.Text = labelName; - AccessoryView = Switch; - - Switch.ValueChanged += Switch_ValueChanged; - } - - private void Switch_ValueChanged(object sender, EventArgs e) - { - ValueChanged?.Invoke(this, null); - } - - public UISwitch Switch { get; set; } = new UISwitch(); - public event EventHandler ValueChanged; - } -} diff --git a/src/iOS.Core/Views/Toast.cs b/src/iOS.Core/Views/Toast.cs deleted file mode 100644 index e076b32dc..000000000 --- a/src/iOS.Core/Views/Toast.cs +++ /dev/null @@ -1,143 +0,0 @@ -using Foundation; -using System; -using UIKit; - -namespace Bit.iOS.Core.Views -{ - public class Toast : UIView - { - private NSTimer _dismissTimer; - private NSLayoutConstraint _heightConstraint; - private NSLayoutConstraint _leftMarginConstraint; - private NSLayoutConstraint _rightMarginConstraint; - private NSLayoutConstraint _bottomMarginConstraint; - - public Toast(string text) - : base(CoreGraphics.CGRect.FromLTRB(0, 0, 320, 38)) - { - TranslatesAutoresizingMaskIntoConstraints = false; - BackgroundColor = UIColor.DarkGray.ColorWithAlpha(0.9f); - Layer.CornerRadius = 15; - Layer.MasksToBounds = true; - - MessageLabel = new UILabel - { - TranslatesAutoresizingMaskIntoConstraints = false, - TextColor = UIColor.White, - Font = UIFont.SystemFontOfSize(14), - BackgroundColor = UIColor.Clear, - LineBreakMode = UILineBreakMode.WordWrap, - TextAlignment = UITextAlignment.Center, - Lines = 0, - Text = text - }; - - AddSubview(MessageLabel); - - var hMessageConstraints = NSLayoutConstraint.FromVisualFormat("H:|-5-[messageLabel]-5-|", 0, new NSDictionary(), - NSDictionary.FromObjectsAndKeys(new NSObject[] { MessageLabel }, - new NSObject[] { new NSString("messageLabel") }) - ); - - var vMessageConstraints = NSLayoutConstraint.FromVisualFormat("V:|-0-[messageLabel]-0-|", 0, new NSDictionary(), - NSDictionary.FromObjectsAndKeys(new NSObject[] { MessageLabel }, - new NSObject[] { new NSString("messageLabel") }) - ); - - AddConstraints(hMessageConstraints); - AddConstraints(vMessageConstraints); - - AddGestureRecognizer(new UITapGestureRecognizer(() => Dismiss(false))); - } - - public bool Dismissed { get; set; } - public Action DismissCallback { get; set; } - public TimeSpan Duration { get; set; } = TimeSpan.FromSeconds(3); - public UILabel MessageLabel { get; set; } - public nfloat LeftMargin { get; set; } = 5; - public nfloat RightMargin { get; set; } = 5; - public nfloat BottomMargin { get; set; } = 5; - public nfloat Height { get; set; } = 38; - - public void Show() - { - if(Superview != null) - { - return; - } - - _dismissTimer = NSTimer.CreateScheduledTimer(Duration, x => Dismiss()); - LayoutIfNeeded(); - - var localSuperView = UIApplication.SharedApplication.KeyWindow; - if(localSuperView != null) - { - localSuperView.AddSubview(this); - - _heightConstraint = NSLayoutConstraint.Create(this, NSLayoutAttribute.Height, - NSLayoutRelation.GreaterThanOrEqual, null, NSLayoutAttribute.NoAttribute, 1, Height); - - _leftMarginConstraint = NSLayoutConstraint.Create(this, NSLayoutAttribute.Left, NSLayoutRelation.Equal, - localSuperView, NSLayoutAttribute.Left, 1, LeftMargin); - - _rightMarginConstraint = NSLayoutConstraint.Create(this, NSLayoutAttribute.Right, NSLayoutRelation.Equal, - localSuperView, NSLayoutAttribute.Right, 1, -RightMargin); - - _bottomMarginConstraint = NSLayoutConstraint.Create(this, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, - localSuperView, NSLayoutAttribute.Bottom, 1, -BottomMargin); - - // Avoid the "UIView-Encapsulated-Layout-Height" constraint conflicts - // http://stackoverflow.com/questions/25059443/what-is-nslayoutconstraint-uiview-encapsulated-layout-height-and-how-should-i - _leftMarginConstraint.Priority = 999; - _rightMarginConstraint.Priority = 999; - - AddConstraint(_heightConstraint); - localSuperView.AddConstraint(_leftMarginConstraint); - localSuperView.AddConstraint(_rightMarginConstraint); - localSuperView.AddConstraint(_bottomMarginConstraint); - - ShowWithAnimation(); - } - else - { - Console.WriteLine("Toast needs a keyWindows to display."); - } - } - - public void Dismiss(bool animated = true) - { - if(Dismissed) - { - return; - } - - Dismissed = true; - _dismissTimer?.Invalidate(); - _dismissTimer = null; - - if(!animated) - { - RemoveFromSuperview(); - DismissCallback?.Invoke(); - return; - } - - SetNeedsLayout(); - Animate(0.3f, 0, UIViewAnimationOptions.CurveEaseIn, () => { Alpha = 0; }, () => - { - RemoveFromSuperview(); - DismissCallback?.Invoke(); - }); - } - - private void ShowWithAnimation() - { - Alpha = 0; - SetNeedsLayout(); - _bottomMarginConstraint.Constant = -BottomMargin; - _leftMarginConstraint.Constant = LeftMargin; - _rightMarginConstraint.Constant = -RightMargin; - AnimateNotify(0.3f, 0, 0.7f, 5f, UIViewAnimationOptions.CurveEaseInOut, () => { Alpha = 1; }, null); - } - } -} diff --git a/src/iOS.Core/iOS.Core.csproj b/src/iOS.Core/iOS.Core.csproj deleted file mode 100644 index 9972b60dc..000000000 --- a/src/iOS.Core/iOS.Core.csproj +++ /dev/null @@ -1,86 +0,0 @@ - - - - Debug - AnyCPU - {B2538ADA-B605-4D6F-ACD2-62A409680F84} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Bit.iOS.Core - Resources - BitwardeniOSCore - - - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {8a279ee4-4537-4656-9c93-44945e594556} - App - - - - \ No newline at end of file diff --git a/src/iOS.Extension/AppDelegate.cs b/src/iOS.Extension/AppDelegate.cs deleted file mode 100644 index a8149c102..000000000 --- a/src/iOS.Extension/AppDelegate.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; - -using Foundation; -using UIKit; - -namespace Bit.iOS.Extension -{ - // The UIApplicationDelegate for the application. This class is responsible for launching the - // User Interface of the application, as well as listening (and optionally responding) to - // application events from iOS. - [Register("AppDelegate")] - public partial class AppDelegate : UIApplicationDelegate - { - // class-level declarations - - public override UIWindow Window - { - get; set; - } - - // This method is invoked when the application is about to move from active to inactive state. - // OpenGL applications should use this method to pause. - public override void OnResignActivation(UIApplication application) - { - } - - // This method should be used to release shared resources and it should store the application state. - // If your application supports background exection this method is called instead of WillTerminate - // when the user quits. - public override void DidEnterBackground(UIApplication application) - { - } - - // This method is called as part of the transiton from background to active state. - public override void WillEnterForeground(UIApplication application) - { - } - - // This method is called when the application is about to terminate. Save data, if needed. - public override void WillTerminate(UIApplication application) - { - } - } -} diff --git a/src/iOS.Extension/Entitlements.plist b/src/iOS.Extension/Entitlements.plist deleted file mode 100644 index b20900dcc..000000000 --- a/src/iOS.Extension/Entitlements.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.8bit.bitwarden - - keychain-access-groups - - $(AppIdentifierPrefix)com.8bit.bitwarden - - - diff --git a/src/iOS.Extension/Info.plist b/src/iOS.Extension/Info.plist deleted file mode 100644 index 11ca56447..000000000 --- a/src/iOS.Extension/Info.plist +++ /dev/null @@ -1,104 +0,0 @@ - - - - - MinimumOSVersion - 10.0 - CFBundleDevelopmentRegion - en - CFBundleIdentifier - com.8bit.bitwarden.find-login-action-extension - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - XPC! - CFBundleShortVersionString - 1.22.0 - CFBundleSignature - ???? - CFBundleVersion - 46 - NSExtension - - NSExtensionAttributes - - NSExtensionJavaScriptPreprocessingFile - extension - NSExtensionActivationRule - SUBQUERY ( - extensionItems, - $extensionItem, - SUBQUERY ( - $extensionItem.attachments, - $attachment, - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.find-login-action" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.save-login-action" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.change-password-action" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.fill-webview-action" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.fill-browser-action" - || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.8bit.bitwarden.extension-setup" - ).@count == $extensionItem.attachments.@count - ).@count == 1 - - NSExtensionMainStoryboard - MainInterface - NSExtensionPointIdentifier - com.apple.ui-services - - UIDeviceFamily - - 1 - 2 - - UISupportedInterfaceOrientations - - ITSAppUsesNonExemptEncryption - - ITSEncryptionExportComplianceCode - ecf076d3-4824-4d7b-b716-2a9a47d7d296 - CFBundleName - Bitwarden Extension - CFBundleDisplayName - Bitwarden - UIRequiredDeviceCapabilities - - arm64 - - - CFBundleLocalizations - - en - es - zh-Hans - zh-Hant - pt-PT - pt-BR - sv - sk - it - fi - fr - ro - id - hr - hu - nl - tr - uk - de - dk - cz - nb - ja - et - vi - pl - ko - fa - - NSFaceIDUsageDescription - Use Face ID to unlock your vault. - - diff --git a/src/iOS.Extension/LoadingViewController.cs b/src/iOS.Extension/LoadingViewController.cs deleted file mode 100644 index d33996598..000000000 --- a/src/iOS.Extension/LoadingViewController.cs +++ /dev/null @@ -1,530 +0,0 @@ -using System; -using System.Drawing; -using System.Diagnostics; -using Bit.App.Abstractions; -using Bit.App.Repositories; -using Bit.App.Services; -using Bit.iOS.Core.Services; -using Foundation; -using UIKit; -using XLabs.Ioc; -using Bit.iOS.Core; -using Newtonsoft.Json; -using Bit.iOS.Extension.Models; -using MobileCoreServices; -using Plugin.Settings.Abstractions; -using Plugin.Connectivity; -using Plugin.Fingerprint; -using Bit.iOS.Core.Utilities; -using Bit.App.Resources; -using Bit.iOS.Core.Controllers; -using SimpleInjector; -using XLabs.Ioc.SimpleInjectorContainer; -using System.Collections.Generic; -using Bit.iOS.Core.Models; - -namespace Bit.iOS.Extension -{ - public partial class LoadingViewController : ExtendedUIViewController - { - private Context _context = new Context(); - private bool _setupHockeyApp = false; - private readonly JsonSerializerSettings _jsonSettings = - new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - private IGoogleAnalyticsService _googleAnalyticsService; - - public LoadingViewController(IntPtr handle) : base(handle) - { } - - public override void ViewDidLoad() - { - SetIoc(); - SetCulture(); - - base.ViewDidLoad(); - View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); - _context.ExtContext = ExtensionContext; - _googleAnalyticsService = Resolver.Resolve(); - - if(!_setupHockeyApp) - { - var appIdService = Resolver.Resolve(); - var crashManagerDelegate = new HockeyAppCrashManagerDelegate(appIdService, Resolver.Resolve()); - var manager = HockeyApp.iOS.BITHockeyManager.SharedHockeyManager; - manager.Configure("51f96ae568ba45f699a18ad9f63046c3", crashManagerDelegate); - manager.CrashManager.CrashManagerStatus = HockeyApp.iOS.BITCrashManagerStatus.AutoSend; - manager.UserId = appIdService.AppId; - manager.StartManager(); - manager.Authenticator.AuthenticateInstallation(); - _setupHockeyApp = true; - } - - foreach(var item in ExtensionContext.InputItems) - { - var processed = false; - foreach(var itemProvider in item.Attachments) - { - if(ProcessWebUrlProvider(itemProvider) - || ProcessFindLoginProvider(itemProvider) - || ProcessFindLoginBrowserProvider(itemProvider, Constants.UTTypeAppExtensionFillBrowserAction) - || ProcessFindLoginBrowserProvider(itemProvider, Constants.UTTypeAppExtensionFillWebViewAction) - || ProcessSaveLoginProvider(itemProvider) - || ProcessChangePasswordProvider(itemProvider) - || ProcessExtensionSetupProvider(itemProvider)) - { - processed = true; - break; - } - } - - if(processed) - { - break; - } - } - } - - public override void ViewDidAppear(bool animated) - { - base.ViewDidAppear(animated); - - var authService = Resolver.Resolve(); - if(!authService.IsAuthenticated) - { - var alert = Dialogs.CreateAlert(null, AppResources.MustLogInMainApp, AppResources.Ok, (a) => - { - CompleteRequest(null); - }); - PresentViewController(alert, true, null); - return; - } - - if(_context.ProviderType == Constants.UTTypeAppExtensionSetup) - { - PerformSegue("setupSegue", this); - return; - } - - var lockService = Resolver.Resolve(); - var lockType = lockService.GetLockTypeAsync(false).GetAwaiter().GetResult(); - switch(lockType) - { - case App.Enums.LockType.Fingerprint: - PerformSegue("lockFingerprintSegue", this); - break; - case App.Enums.LockType.PIN: - PerformSegue("lockPinSegue", this); - break; - case App.Enums.LockType.Password: - PerformSegue("lockPasswordSegue", this); - break; - default: - ContinueOn(); - break; - } - } - - public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) - { - var navController = segue.DestinationViewController as UINavigationController; - if(navController != null) - { - var listLoginController = navController.TopViewController as LoginListViewController; - var addLoginController = navController.TopViewController as LoginAddViewController; - var fingerprintViewController = navController.TopViewController as LockFingerprintViewController; - var pinViewController = navController.TopViewController as LockPinViewController; - var passwordViewController = navController.TopViewController as LockPasswordViewController; - var setupViewController = navController.TopViewController as SetupViewController; - - if(listLoginController != null) - { - listLoginController.Context = _context; - listLoginController.LoadingController = this; - } - else if(addLoginController != null) - { - addLoginController.Context = _context; - addLoginController.LoadingController = this; - } - else if(fingerprintViewController != null) - { - fingerprintViewController.LoadingController = this; - } - else if(pinViewController != null) - { - pinViewController.LoadingController = this; - } - else if(passwordViewController != null) - { - passwordViewController.LoadingController = this; - } - else if(setupViewController != null) - { - setupViewController.Context = _context; - setupViewController.LoadingController = this; - } - } - } - - public void DismissLockAndContinue() - { - Debug.WriteLine("BW Log, Dismissing lock controller."); - DismissViewController(false, () => - { - ContinueOn(); - }); - } - - private void ContinueOn() - { - Debug.WriteLine("BW Log, Segue to setup, login add or list."); - if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction) - { - PerformSegue("newLoginSegue", this); - } - else if(_context.ProviderType == Constants.UTTypeAppExtensionSetup) - { - PerformSegue("setupSegue", this); - } - else - { - PerformSegue("loginListSegue", this); - } - } - - public void CompleteUsernamePasswordRequest(string username, string password, - List> fields, string totp) - { - NSDictionary itemData = null; - if(_context.ProviderType == UTType.PropertyList) - { - var fillScript = new FillScript(_context.Details, username, password, fields); - var scriptJson = JsonConvert.SerializeObject(fillScript, _jsonSettings); - var scriptDict = new NSDictionary(Constants.AppExtensionWebViewPageFillScript, scriptJson); - itemData = new NSDictionary(NSJavaScriptExtension.FinalizeArgumentKey, scriptDict); - } - else if(_context.ProviderType == Constants.UTTypeAppExtensionFindLoginAction) - { - itemData = new NSDictionary( - Constants.AppExtensionUsernameKey, username, - Constants.AppExtensionPasswordKey, password); - } - else if(_context.ProviderType == Constants.UTTypeAppExtensionFillBrowserAction - || _context.ProviderType == Constants.UTTypeAppExtensionFillWebViewAction) - { - var fillScript = new FillScript(_context.Details, username, password, fields); - var scriptJson = JsonConvert.SerializeObject(fillScript, _jsonSettings); - itemData = new NSDictionary(Constants.AppExtensionWebViewPageFillScript, scriptJson); - } - else if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction) - { - itemData = new NSDictionary( - Constants.AppExtensionUsernameKey, username, - Constants.AppExtensionPasswordKey, password); - } - else if(_context.ProviderType == Constants.UTTypeAppExtensionChangePasswordAction) - { - itemData = new NSDictionary( - Constants.AppExtensionPasswordKey, string.Empty, - Constants.AppExtensionOldPasswordKey, password); - } - - if(!string.IsNullOrWhiteSpace(totp)) - { - UIPasteboard.General.String = totp; - } - - CompleteRequest(itemData); - } - - public void CompleteRequest(NSDictionary itemData) - { - Debug.WriteLine("BW LOG, itemData: " + itemData); - - var resultsProvider = new NSItemProvider(itemData, UTType.PropertyList); - var resultsItem = new NSExtensionItem { Attachments = new NSItemProvider[] { resultsProvider } }; - var returningItems = new NSExtensionItem[] { resultsItem }; - - if(itemData != null) - { - _googleAnalyticsService.TrackExtensionEvent("AutoFilled", _context.ProviderType); - } - else - { - _googleAnalyticsService.TrackExtensionEvent("Closed", _context.ProviderType); - } - - _googleAnalyticsService.Dispatch(() => - { - NSRunLoop.Main.BeginInvokeOnMainThread(() => - { - Resolver.ResetResolver(); - ExtensionContext?.CompleteRequest(returningItems, null); - }); - }); - } - - private void SetIoc() - { - var container = new Container(); - - // Services - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterInstance(new DeviceInfoService(true)); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - - // Repositories - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - - // Other - container.RegisterSingleton(CrossConnectivity.Current); - container.RegisterSingleton(CrossFingerprint.Current); - - var settings = new Settings("group.com.8bit.bitwarden"); - container.RegisterSingleton(settings); - - Resolver.ResetResolver(new SimpleInjectorResolver(container)); - } - - private void SetCulture() - { - var localizeService = Resolver.Resolve(); - var ci = localizeService.GetCurrentCultureInfo(); - AppResources.Culture = ci; - localizeService.SetLocale(ci); - } - - private bool ProcessItemProvider(NSItemProvider itemProvider, string type, Action dictAction, - Action urlAction = null) - { - if(!itemProvider.HasItemConformingTo(type)) - { - return false; - } - - itemProvider.LoadItem(type, null, (NSObject list, NSError error) => - { - if(list == null) - { - return; - } - - _context.ProviderType = type; - - var dict = list as NSDictionary; - if(dict != null && dictAction != null) - { - dictAction(dict); - } - else if(list is NSUrl && urlAction != null) - { - var url = list as NSUrl; - urlAction(url); - } - else - { - throw new Exception("Cannot parse list for action. List is " + - (list?.GetType().ToString() ?? "null")); - } - - _googleAnalyticsService.TrackExtensionEvent("ProcessItemProvider", type); - - Debug.WriteLine("BW LOG, ProviderType: " + _context.ProviderType); - Debug.WriteLine("BW LOG, Url: " + _context.UrlString); - Debug.WriteLine("BW LOG, Title: " + _context.LoginTitle); - Debug.WriteLine("BW LOG, Username: " + _context.Username); - Debug.WriteLine("BW LOG, Password: " + _context.Password); - Debug.WriteLine("BW LOG, Old Password: " + _context.OldPassword); - Debug.WriteLine("BW LOG, Notes: " + _context.Notes); - Debug.WriteLine("BW LOG, Details: " + _context.Details); - - if(_context.PasswordOptions != null) - { - Debug.WriteLine("BW LOG, PasswordOptions Min Length: " + _context.PasswordOptions.MinLength); - Debug.WriteLine("BW LOG, PasswordOptions Max Length: " + _context.PasswordOptions.MaxLength); - Debug.WriteLine("BW LOG, PasswordOptions Require Digits: " + _context.PasswordOptions.RequireDigits); - Debug.WriteLine("BW LOG, PasswordOptions Require Symbols: " + _context.PasswordOptions.RequireSymbols); - Debug.WriteLine("BW LOG, PasswordOptions Forbidden Chars: " + _context.PasswordOptions.ForbiddenCharacters); - } - }); - - return true; - } - - private bool ProcessWebUrlProvider(NSItemProvider itemProvider) - { - return ProcessItemProvider(itemProvider, UTType.PropertyList, (dict) => - { - var result = dict[NSJavaScriptExtension.PreprocessingResultsKey]; - if(result == null) - { - return; - } - - _context.UrlString = result.ValueForKey(new NSString(Constants.AppExtensionUrlStringKey)) as NSString; - var jsonStr = result.ValueForKey(new NSString(Constants.AppExtensionWebViewPageDetails)) as NSString; - _context.Details = DeserializeString(jsonStr); - }); - } - - private bool ProcessFindLoginProvider(NSItemProvider itemProvider) - { - return ProcessItemProvider(itemProvider, Constants.UTTypeAppExtensionFindLoginAction, (dict) => - { - var version = dict[Constants.AppExtensionVersionNumberKey] as NSNumber; - var url = dict[Constants.AppExtensionUrlStringKey] as NSString; - - if(url != null) - { - _context.UrlString = url; - } - }); - } - - private bool ProcessFindLoginBrowserProvider(NSItemProvider itemProvider, string action) - { - return ProcessItemProvider(itemProvider, action, (dict) => - { - var version = dict[Constants.AppExtensionVersionNumberKey] as NSNumber; - var url = dict[Constants.AppExtensionUrlStringKey] as NSString; - if(url != null) - { - _context.UrlString = url; - } - - _context.Details = DeserializeDictionary(dict[Constants.AppExtensionWebViewPageDetails] as NSDictionary); - }, (url) => - { - if(url != null) - { - _context.UrlString = url.AbsoluteString; - } - }); - } - - private bool ProcessSaveLoginProvider(NSItemProvider itemProvider) - { - return ProcessItemProvider(itemProvider, Constants.UTTypeAppExtensionSaveLoginAction, (dict) => - { - var version = dict[Constants.AppExtensionVersionNumberKey] as NSNumber; - var url = dict[Constants.AppExtensionUrlStringKey] as NSString; - var title = dict[Constants.AppExtensionTitleKey] as NSString; - var sectionTitle = dict[Constants.AppExtensionSectionTitleKey] as NSString; - var username = dict[Constants.AppExtensionUsernameKey] as NSString; - var password = dict[Constants.AppExtensionPasswordKey] as NSString; - var notes = dict[Constants.AppExtensionNotesKey] as NSString; - var fields = dict[Constants.AppExtensionFieldsKey] as NSDictionary; - - if(url != null) - { - _context.UrlString = url; - } - - _context.LoginTitle = title; - _context.Username = username; - _context.Password = password; - _context.Notes = notes; - _context.PasswordOptions = DeserializeDictionary(dict[Constants.AppExtensionPasswordGeneratorOptionsKey] as NSDictionary); - }); - } - - private bool ProcessChangePasswordProvider(NSItemProvider itemProvider) - { - return ProcessItemProvider(itemProvider, Constants.UTTypeAppExtensionChangePasswordAction, (dict) => - { - var version = dict[Constants.AppExtensionVersionNumberKey] as NSNumber; - var url = dict[Constants.AppExtensionUrlStringKey] as NSString; - var title = dict[Constants.AppExtensionTitleKey] as NSString; - var sectionTitle = dict[Constants.AppExtensionSectionTitleKey] as NSString; - var username = dict[Constants.AppExtensionUsernameKey] as NSString; - var password = dict[Constants.AppExtensionPasswordKey] as NSString; - var oldPassword = dict[Constants.AppExtensionOldPasswordKey] as NSString; - var notes = dict[Constants.AppExtensionNotesKey] as NSString; - var fields = dict[Constants.AppExtensionFieldsKey] as NSDictionary; - - if(url != null) - { - _context.UrlString = url; - } - - _context.LoginTitle = title; - _context.Username = username; - _context.Password = password; - _context.OldPassword = oldPassword; - _context.Notes = notes; - _context.PasswordOptions = DeserializeDictionary(dict[Constants.AppExtensionPasswordGeneratorOptionsKey] as NSDictionary); - }); - } - - private bool ProcessExtensionSetupProvider(NSItemProvider itemProvider) - { - if(itemProvider.HasItemConformingTo(Constants.UTTypeAppExtensionSetup)) - { - _context.ProviderType = Constants.UTTypeAppExtensionSetup; - return true; - } - - return false; - } - - private T DeserializeDictionary(NSDictionary dict) - { - if(dict != null) - { - NSError jsonError; - var jsonData = NSJsonSerialization.Serialize(dict, NSJsonWritingOptions.PrettyPrinted, out jsonError); - if(jsonData != null) - { - var jsonString = new NSString(jsonData, NSStringEncoding.UTF8); - return DeserializeString(jsonString); - } - } - - return default(T); - } - - private T DeserializeString(NSString jsonString) - { - if(jsonString != null) - { - var convertedObject = JsonConvert.DeserializeObject(jsonString.ToString()); - return convertedObject; - } - - return default(T); - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LoadingViewController.designer.cs b/src/iOS.Extension/LoadingViewController.designer.cs deleted file mode 100644 index 5d55235f4..000000000 --- a/src/iOS.Extension/LoadingViewController.designer.cs +++ /dev/null @@ -1,21 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Visual Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LoadingViewController")] - partial class LoadingViewController - { - void ReleaseDesignerOutlets () - { - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LockFingerprintViewController.cs b/src/iOS.Extension/LockFingerprintViewController.cs deleted file mode 100644 index a5a81466a..000000000 --- a/src/iOS.Extension/LockFingerprintViewController.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Extension -{ - public partial class LockFingerprintViewController : Core.Controllers.LockFingerprintViewController - { - public LockFingerprintViewController(IntPtr handle) : base(handle) - { } - - public LoadingViewController LoadingController { get; set; } - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelButton; - public override UIButton BaseUseButton => UseButton; - public override UIButton BaseFingerprintButton => FingerprintButton; - public override Action Success => () => LoadingController.DismissLockAndContinue(); - - partial void CancelButton_Activated(UIBarButtonItem sender) - { - LoadingController.CompleteRequest(null); - } - - partial void FingerprintButton_TouchUpInside(UIButton sender) - { - var task = CheckFingerprintAsync(); - } - } -} diff --git a/src/iOS.Extension/LockFingerprintViewController.designer.cs b/src/iOS.Extension/LockFingerprintViewController.designer.cs deleted file mode 100644 index 6fb08458b..000000000 --- a/src/iOS.Extension/LockFingerprintViewController.designer.cs +++ /dev/null @@ -1,64 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LockFingerprintViewController")] - partial class LockFingerprintViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIButton FingerprintButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIButton UseButton { get; set; } - - [Action ("CancelButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("FingerprintButton_TouchUpInside:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void FingerprintButton_TouchUpInside (UIKit.UIButton sender); - - void ReleaseDesignerOutlets () - { - if (CancelButton != null) { - CancelButton.Dispose (); - CancelButton = null; - } - - if (FingerprintButton != null) { - FingerprintButton.Dispose (); - FingerprintButton = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (UseButton != null) { - UseButton.Dispose (); - UseButton = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LockPasswordViewController.cs b/src/iOS.Extension/LockPasswordViewController.cs deleted file mode 100644 index d51531591..000000000 --- a/src/iOS.Extension/LockPasswordViewController.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Extension -{ - public partial class LockPasswordViewController : Core.Controllers.LockPasswordViewController - { - public LockPasswordViewController(IntPtr handle) : base(handle) - { } - - public LoadingViewController LoadingController { get; set; } - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelButton; - public override UIBarButtonItem BaseSubmitButton => SubmitButton; - public override Action Success => () => LoadingController.DismissLockAndContinue(); - - partial void SubmitButton_Activated(UIBarButtonItem sender) - { - CheckPassword(); - } - - partial void CancelButton_Activated(UIBarButtonItem sender) - { - LoadingController.CompleteRequest(null); - } - } -} diff --git a/src/iOS.Extension/LockPasswordViewController.designer.cs b/src/iOS.Extension/LockPasswordViewController.designer.cs deleted file mode 100644 index fdc17a29f..000000000 --- a/src/iOS.Extension/LockPasswordViewController.designer.cs +++ /dev/null @@ -1,64 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LockPasswordViewController")] - partial class LockPasswordViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UITableView MainTableView { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem SubmitButton { get; set; } - - [Action ("CancelButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("SubmitButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void SubmitButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (CancelButton != null) { - CancelButton.Dispose (); - CancelButton = null; - } - - if (MainTableView != null) { - MainTableView.Dispose (); - MainTableView = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (SubmitButton != null) { - SubmitButton.Dispose (); - SubmitButton = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LockPinViewController.cs b/src/iOS.Extension/LockPinViewController.cs deleted file mode 100644 index 2737135be..000000000 --- a/src/iOS.Extension/LockPinViewController.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Extension -{ - public partial class LockPinViewController : Core.Controllers.LockPinViewController - { - public LockPinViewController(IntPtr handle) : base(handle) - { } - - public LoadingViewController LoadingController { get; set; } - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelButton; - public override UILabel BasePinLabel => PinLabel; - public override UILabel BaseInstructionLabel => InstructionLabel; - public override UITextField BasePinTextField => PinTextField; - public override Action Success => () => LoadingController.DismissLockAndContinue(); - - partial void CancelButton_Activated(UIBarButtonItem sender) - { - LoadingController.CompleteRequest(null); - } - } -} diff --git a/src/iOS.Extension/LockPinViewController.designer.cs b/src/iOS.Extension/LockPinViewController.designer.cs deleted file mode 100644 index 4dfa52722..000000000 --- a/src/iOS.Extension/LockPinViewController.designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LockPinViewController")] - partial class LockPinViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel InstructionLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel PinLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UITextField PinTextField { get; set; } - - [Action ("CancelButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (CancelButton != null) { - CancelButton.Dispose (); - CancelButton = null; - } - - if (InstructionLabel != null) { - InstructionLabel.Dispose (); - InstructionLabel = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (PinLabel != null) { - PinLabel.Dispose (); - PinLabel = null; - } - - if (PinTextField != null) { - PinTextField.Dispose (); - PinTextField = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LoginAddViewController.cs b/src/iOS.Extension/LoginAddViewController.cs deleted file mode 100644 index ce1c83613..000000000 --- a/src/iOS.Extension/LoginAddViewController.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using Foundation; -using UIKit; - -namespace Bit.iOS.Extension -{ - public partial class LoginAddViewController : Core.Controllers.LoginAddViewController - { - public LoginAddViewController(IntPtr handle) : base(handle) - { } - - public LoginListViewController LoginListController { get; set; } - public LoadingViewController LoadingController { get; set; } - - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelBarButton; - public override UIBarButtonItem BaseSaveButton => SaveBarButton; - - public override Action Success => () => - { - _googleAnalyticsService.TrackExtensionEvent("CreatedLogin"); - if(LoginListController != null) - { - LoginListController.DismissModal(); - } - else if(LoadingController != null) - { - LoadingController.CompleteUsernamePasswordRequest(UsernameCell.TextField.Text, - PasswordCell.TextField.Text, null, null); - } - }; - - partial void CancelBarButton_Activated(UIBarButtonItem sender) - { - if(LoginListController != null) - { - DismissViewController(true, null); - } - else - { - LoadingController.CompleteRequest(null); - } - } - - async partial void SaveBarButton_Activated(UIBarButtonItem sender) - { - await this.SaveAsync(); - } - - public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) - { - var navController = segue.DestinationViewController as UINavigationController; - if(navController != null) - { - var passwordGeneratorController = navController.TopViewController as PasswordGeneratorViewController; - if(passwordGeneratorController != null) - { - passwordGeneratorController.PasswordOptions = Context.PasswordOptions; - passwordGeneratorController.Parent = this; - } - } - } - } -} diff --git a/src/iOS.Extension/LoginAddViewController.designer.cs b/src/iOS.Extension/LoginAddViewController.designer.cs deleted file mode 100644 index 191c7991b..000000000 --- a/src/iOS.Extension/LoginAddViewController.designer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LoginAddViewController")] - partial class LoginAddViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelBarButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem SaveBarButton { get; set; } - - [Action ("CancelBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelBarButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("SaveBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void SaveBarButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (CancelBarButton != null) { - CancelBarButton.Dispose (); - CancelBarButton = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (SaveBarButton != null) { - SaveBarButton.Dispose (); - SaveBarButton = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/LoginListViewController.cs b/src/iOS.Extension/LoginListViewController.cs deleted file mode 100644 index b332e51cc..000000000 --- a/src/iOS.Extension/LoginListViewController.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Linq; -using Bit.iOS.Extension.Models; -using Foundation; -using UIKit; -using Bit.iOS.Core.Utilities; -using Bit.iOS.Core; -using MobileCoreServices; -using Bit.iOS.Core.Controllers; -using Bit.App.Resources; -using Bit.iOS.Core.Views; - -namespace Bit.iOS.Extension -{ - public partial class LoginListViewController : ExtendedUITableViewController - { - public LoginListViewController(IntPtr handle) : base(handle) - { } - - public Context Context { get; set; } - public LoadingViewController LoadingController { get; set; } - - public override void ViewWillAppear(bool animated) - { - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - base.ViewWillAppear(animated); - } - - public async override void ViewDidLoad() - { - base.ViewDidLoad(); - NavItem.Title = AppResources.Items; - if(!CanAutoFill()) - { - CancelBarButton.Title = AppResources.Close; - } - else - { - CancelBarButton.Title = AppResources.Cancel; - } - - TableView.RowHeight = UITableView.AutomaticDimension; - TableView.EstimatedRowHeight = 44; - TableView.Source = new TableSource(this); - await ((TableSource)TableView.Source).LoadItemsAsync(); - } - - public bool CanAutoFill() - { - if(Context.ProviderType != Constants.UTTypeAppExtensionFillBrowserAction - && Context.ProviderType != Constants.UTTypeAppExtensionFillWebViewAction - && Context.ProviderType != UTType.PropertyList) - { - return true; - } - - return Context.Details?.HasPasswordField ?? false; - - } - - partial void CancelBarButton_Activated(UIBarButtonItem sender) - { - LoadingController.CompleteRequest(null); - } - - partial void AddBarButton_Activated(UIBarButtonItem sender) - { - PerformSegue("loginAddSegue", this); - } - - public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) - { - var navController = segue.DestinationViewController as UINavigationController; - if(navController != null) - { - var addLoginController = navController.TopViewController as LoginAddViewController; - if(addLoginController != null) - { - addLoginController.Context = Context; - addLoginController.LoginListController = this; - } - } - } - - public void DismissModal() - { - DismissViewController(true, async () => - { - await ((TableSource)TableView.Source).LoadItemsAsync(); - TableView.ReloadData(); - }); - } - - public class TableSource : ExtensionTableSource - { - private LoginListViewController _controller; - - public TableSource(LoginListViewController controller) - : base(controller.Context, controller) - { - _controller = controller; - } - - public override void RowSelected(UITableView tableView, NSIndexPath indexPath) - { - tableView.DeselectRow(indexPath, true); - tableView.EndEditing(true); - - if(Items == null || Items.Count() == 0) - { - _controller.PerformSegue("loginAddSegue", this); - return; - } - - var item = Items.ElementAt(indexPath.Row); - if(item == null) - { - _controller.LoadingController.CompleteRequest(null); - return; - } - - if(_controller.CanAutoFill() && !string.IsNullOrWhiteSpace(item.Password)) - { - string totp = null; - if(!_settings.GetValueOrDefault(App.Constants.SettingDisableTotpCopy, false)) - { - totp = GetTotp(item); - } - - _controller.LoadingController.CompleteUsernamePasswordRequest(item.Username, item.Password, - item.Fields.Value, totp); - } - else if(!string.IsNullOrWhiteSpace(item.Username) || !string.IsNullOrWhiteSpace(item.Password) || - !string.IsNullOrWhiteSpace(item.Totp.Value)) - { - var sheet = Dialogs.CreateActionSheet(item.Name, _controller); - if(!string.IsNullOrWhiteSpace(item.Username)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyUsername, UIAlertActionStyle.Default, a => - { - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = item.Username; - var alert = Dialogs.CreateMessageAlert(AppResources.CopyUsername); - _controller.PresentViewController(alert, true, () => - { - _controller.DismissViewController(true, null); - }); - })); - } - - if(!string.IsNullOrWhiteSpace(item.Password)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyPassword, UIAlertActionStyle.Default, a => - { - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = item.Password; - var alert = Dialogs.CreateMessageAlert(AppResources.CopiedPassword); - _controller.PresentViewController(alert, true, () => - { - _controller.DismissViewController(true, null); - }); - })); - } - - if(!string.IsNullOrWhiteSpace(item.Totp.Value)) - { - sheet.AddAction(UIAlertAction.Create(AppResources.CopyTotp, UIAlertActionStyle.Default, a => - { - var totp = GetTotp(item); - if(string.IsNullOrWhiteSpace(totp)) - { - return; - } - - UIPasteboard clipboard = UIPasteboard.General; - clipboard.String = totp; - var alert = Dialogs.CreateMessageAlert(AppResources.CopiedTotp); - _controller.PresentViewController(alert, true, () => - { - _controller.DismissViewController(true, null); - }); - })); - } - - sheet.AddAction(UIAlertAction.Create(AppResources.Cancel, UIAlertActionStyle.Cancel, null)); - _controller.PresentViewController(sheet, true, null); - } - else - { - var alert = Dialogs.CreateAlert(null, AppResources.NoUsernamePasswordConfigured, AppResources.Ok); - _controller.PresentViewController(alert, true, null); - } - } - } - } -} diff --git a/src/iOS.Extension/LoginListViewController.designer.cs b/src/iOS.Extension/LoginListViewController.designer.cs deleted file mode 100644 index aa1abf2ea..000000000 --- a/src/iOS.Extension/LoginListViewController.designer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("LoginListViewController")] - partial class LoginListViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem AddBarButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelBarButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Action ("AddBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void AddBarButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("CancelBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelBarButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (AddBarButton != null) { - AddBarButton.Dispose (); - AddBarButton = null; - } - - if (CancelBarButton != null) { - CancelBarButton.Dispose (); - CancelBarButton = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/Main.cs b/src/iOS.Extension/Main.cs deleted file mode 100644 index 9291201f8..000000000 --- a/src/iOS.Extension/Main.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UIKit; - -namespace Bit.iOS.Extension -{ - public class Application - { - // This is the main entry point of the application. - static void Main(string[] args) - { - // if you want to use a different Application Delegate class from "AppDelegate" - // you can specify it here. - UIApplication.Main(args, null, "AppDelegate"); - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/MainInterface.storyboard b/src/iOS.Extension/MainInterface.storyboard deleted file mode 100644 index f107fe8ef..000000000 --- a/src/iOS.Extension/MainInterface.storyboard +++ /dev/null @@ -1,615 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/iOS.Extension/Models/Context.cs b/src/iOS.Extension/Models/Context.cs deleted file mode 100644 index 94015819e..000000000 --- a/src/iOS.Extension/Models/Context.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Foundation; -using Bit.iOS.Core.Models; - -namespace Bit.iOS.Extension.Models -{ - public class Context : AppExtensionContext - { - private string _uriString; - - public NSExtensionContext ExtContext { get; set; } - public string ProviderType { get; set; } - public string LoginTitle { get; set; } - public string Username { get; set; } - public string Password { get; set; } - public string OldPassword { get; set; } - public string Notes { get; set; } - public PageDetails Details { get; set; } - } -} diff --git a/src/iOS.Extension/Models/FillScript.cs b/src/iOS.Extension/Models/FillScript.cs deleted file mode 100644 index 0364d14dd..000000000 --- a/src/iOS.Extension/Models/FillScript.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using System.Text.RegularExpressions; - -namespace Bit.iOS.Extension.Models -{ - public class FillScript - { - private static string[] _usernameFieldNames = new[]{ "username", "user name", "email", - "email address", "e-mail", "e-mail address", "userid", "user id" }; - - public FillScript(PageDetails pageDetails, string fillUsername, string fillPassword, - List> fillFields) - { - if(pageDetails == null) - { - return; - } - - DocumentUUID = pageDetails.DocumentUUID; - - var filledFields = new Dictionary(); - - if(fillFields?.Any() ?? false) - { - var fieldNames = fillFields.Select(f => f.Item1?.ToLower()).ToArray(); - foreach(var field in pageDetails.Fields.Where(f => f.Viewable)) - { - if(filledFields.ContainsKey(field.OpId)) - { - continue; - } - - var matchingIndex = FindMatchingFieldIndex(field, fieldNames); - if(matchingIndex > -1) - { - filledFields.Add(field.OpId, field); - Script.Add(new List { "click_on_opid", field.OpId }); - Script.Add(new List { "fill_by_opid", field.OpId, fillFields[matchingIndex].Item2 }); - } - } - } - - if(string.IsNullOrWhiteSpace(fillPassword)) - { - // No password for this login. Maybe they just wanted to auto-fill some custom fields? - SetFillScriptForFocus(filledFields); - return; - } - - List usernames = new List(); - List passwords = new List(); - - var passwordFields = pageDetails.Fields.Where(f => f.Type == "password" && f.Viewable).ToArray(); - if(!passwordFields.Any()) - { - // not able to find any viewable password fields. maybe there are some "hidden" ones? - passwordFields = pageDetails.Fields.Where(f => f.Type == "password").ToArray(); - } - - foreach(var form in pageDetails.Forms) - { - var passwordFieldsForForm = passwordFields.Where(f => f.Form == form.Key).ToArray(); - passwords.AddRange(passwordFieldsForForm); - - if(string.IsNullOrWhiteSpace(fillUsername)) - { - continue; - } - - foreach(var pf in passwordFieldsForForm) - { - var username = FindUsernameField(pageDetails, pf, false, true); - if(username == null) - { - // not able to find any viewable username fields. maybe there are some "hidden" ones? - username = FindUsernameField(pageDetails, pf, true, true); - } - - if(username != null) - { - usernames.Add(username); - } - } - } - - if(passwordFields.Any() && !passwords.Any()) - { - // The page does not have any forms with password fields. Use the first password field on the page and the - // input field just before it as the username. - - var pf = passwordFields.First(); - passwords.Add(pf); - - if(!string.IsNullOrWhiteSpace(fillUsername) && pf.ElementNumber > 0) - { - var username = FindUsernameField(pageDetails, pf, false, false); - if(username == null) - { - // not able to find any viewable username fields. maybe there are some "hidden" ones? - username = FindUsernameField(pageDetails, pf, true, false); - } - - if(username != null) - { - usernames.Add(username); - } - } - } - - if(!passwordFields.Any()) - { - // No password fields on this page. Let's try to just fuzzy fill the username. - var usernameFieldNamesList = _usernameFieldNames.ToList(); - foreach(var f in pageDetails.Fields) - { - if(f.Viewable && (f.Type == "text" || f.Type == "email" || f.Type == "tel") && - FieldIsFuzzyMatch(f, usernameFieldNamesList)) - { - usernames.Add(f); - } - } - } - - foreach(var username in usernames.Where(u => !filledFields.ContainsKey(u.OpId))) - { - filledFields.Add(username.OpId, username); - Script.Add(new List { "click_on_opid", username.OpId }); - Script.Add(new List { "fill_by_opid", username.OpId, fillUsername }); - } - - foreach(var password in passwords.Where(p => !filledFields.ContainsKey(p.OpId))) - { - filledFields.Add(password.OpId, password); - Script.Add(new List { "click_on_opid", password.OpId }); - Script.Add(new List { "fill_by_opid", password.OpId, fillPassword }); - } - - SetFillScriptForFocus(filledFields); - } - - private PageDetails.Field FindUsernameField(PageDetails pageDetails, PageDetails.Field passwordField, bool canBeHidden, - bool checkForm) - { - PageDetails.Field usernameField = null; - - foreach(var f in pageDetails.Fields) - { - if(f.ElementNumber >= passwordField.ElementNumber) - { - break; - } - - if((!checkForm || f.Form == passwordField.Form) - && (canBeHidden || f.Viewable) - && f.ElementNumber < passwordField.ElementNumber - && (f.Type == "text" || f.Type == "email" || f.Type == "tel")) - { - usernameField = f; - - if(FindMatchingFieldIndex(f, _usernameFieldNames) > -1) - { - // We found an exact match. No need to keep looking. - break; - } - } - } - - return usernameField; - } - - private int FindMatchingFieldIndex(PageDetails.Field field, string[] names) - { - var matchingIndex = -1; - if(!string.IsNullOrWhiteSpace(field.HtmlId)) - { - matchingIndex = Array.IndexOf(names, field.HtmlId.ToLower()); - } - if(matchingIndex < 0 && !string.IsNullOrWhiteSpace(field.HtmlName)) - { - matchingIndex = Array.IndexOf(names, field.HtmlName.ToLower()); - } - if(matchingIndex < 0 && !string.IsNullOrWhiteSpace(field.LabelTag)) - { - matchingIndex = Array.IndexOf(names, CleanLabel(field.LabelTag)); - } - if(matchingIndex < 0 && !string.IsNullOrWhiteSpace(field.Placeholder)) - { - matchingIndex = Array.IndexOf(names, field.Placeholder.ToLower()); - } - - return matchingIndex; - } - - private bool FieldIsFuzzyMatch(PageDetails.Field field, List names) - { - if(!string.IsNullOrWhiteSpace(field.HtmlId) && FuzzyMatch(names, field.HtmlId.ToLower())) - { - return true; - } - if(!string.IsNullOrWhiteSpace(field.HtmlName) && FuzzyMatch(names, field.HtmlName.ToLower())) - { - return true; - } - if(!string.IsNullOrWhiteSpace(field.LabelTag) && FuzzyMatch(names, CleanLabel(field.LabelTag))) - { - return true; - } - if(!string.IsNullOrWhiteSpace(field.Placeholder) && FuzzyMatch(names, field.Placeholder.ToLower())) - { - return true; - } - - return false; - } - - private bool FuzzyMatch(List options, string value) - { - if((!options?.Any() ?? true) || string.IsNullOrWhiteSpace(value)) - { - return false; - } - - return options.Any(o => value.Contains(o)); - } - - private void SetFillScriptForFocus(IDictionary filledFields) - { - if(!filledFields.Any()) - { - return; - } - - PageDetails.Field lastField = null, lastPasswordField = null; - foreach(var field in filledFields) - { - if(field.Value.Viewable) - { - lastField = field.Value; - if(field.Value.Type == "password") - { - lastPasswordField = field.Value; - } - } - } - - // Prioritize password field over others. - if(lastPasswordField != null) - { - Script.Add(new List { "focus_by_opid", lastPasswordField.OpId }); - } - else if(lastField != null) - { - Script.Add(new List { "focus_by_opid", lastField.OpId }); - } - } - - private string CleanLabel(string label) - { - return Regex.Replace(label, @"(?:\r\n|\r|\n)", string.Empty).Trim().ToLower(); - } - - [JsonProperty(PropertyName = "script")] - public List> Script { get; set; } = new List>(); - [JsonProperty(PropertyName = "documentUUID")] - public object DocumentUUID { get; set; } - [JsonProperty(PropertyName = "properties")] - public object Properties { get; set; } = new object(); - [JsonProperty(PropertyName = "options")] - public object Options { get; set; } = new { animate = false }; - [JsonProperty(PropertyName = "metadata")] - public object MetaData { get; set; } = new object(); - } -} diff --git a/src/iOS.Extension/Models/PageDetails.cs b/src/iOS.Extension/Models/PageDetails.cs deleted file mode 100644 index 004173bfc..000000000 --- a/src/iOS.Extension/Models/PageDetails.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Bit.iOS.Extension.Models -{ - public class PageDetails - { - public string DocumentUUID { get; set; } - public string Title { get; set; } - public string Url { get; set; } - public string DocumentUrl { get; set; } - public string TabUrl { get; set; } - public Dictionary Forms { get; set; } - public List Fields { get; set; } - public long CollectedTimestamp { get; set; } - public bool HasPasswordField => Fields.Any(f => f.Type == "password"); - - public class Form - { - public string OpId { get; set; } - public string HtmlName { get; set; } - public string HtmlId { get; set; } - public string HtmlAction { get; set; } - public string HtmlMethod { get; set; } - } - - public class Field - { - public string OpId { get; set; } - public int ElementNumber { get; set; } - public bool Visible { get; set; } - public bool Viewable { get; set; } - public string HtmlId { get; set; } - public string HtmlName { get; set; } - public string HtmlClass { get; set; } - public string LabelRight { get; set; } - public string LabelLeft { get; set; } - [JsonProperty("label-tag")] - public string LabelTag { get; set; } - public string Placeholder { get; set; } - public string Type { get; set; } - public string Value { get; set; } - public bool Disabled { get; set; } - public bool Readonly { get; set; } - public string OnePasswordFieldType { get; set; } - public string Form { get; set; } - } - } - -} diff --git a/src/iOS.Extension/PasswordGeneratorViewController.cs b/src/iOS.Extension/PasswordGeneratorViewController.cs deleted file mode 100644 index 4b015c243..000000000 --- a/src/iOS.Extension/PasswordGeneratorViewController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using UIKit; - -namespace Bit.iOS.Extension -{ - public partial class PasswordGeneratorViewController : Core.Controllers.PasswordGeneratorViewController - { - public PasswordGeneratorViewController(IntPtr handle) : base(handle, false) - { } - - public LoginAddViewController Parent { get; set; } - public override UINavigationItem BaseNavItem => NavItem; - public override UIBarButtonItem BaseCancelButton => CancelBarButton; - public override UIBarButtonItem BaseSelectBarButton => SelectBarButton; - public override UILabel BasePasswordLabel => PasswordLabel; - - partial void SelectBarButton_Activated(UIBarButtonItem sender) - { - GoogleAnalyticsService.TrackExtensionEvent("SelectedGeneratedPassword"); - DismissViewController(true, () => - { - Parent.PasswordCell.TextField.Text = PasswordLabel.Text; - }); - } - - partial void CancelBarButton_Activated(UIBarButtonItem sender) - { - DismissViewController(true, null); - } - } -} diff --git a/src/iOS.Extension/PasswordGeneratorViewController.designer.cs b/src/iOS.Extension/PasswordGeneratorViewController.designer.cs deleted file mode 100644 index 950ebf7a5..000000000 --- a/src/iOS.Extension/PasswordGeneratorViewController.designer.cs +++ /dev/null @@ -1,82 +0,0 @@ -// WARNING -// -// This file has been generated automatically by Xamarin Studio from the outlets and -// actions declared in your storyboard file. -// Manual changes to this file will not be maintained. -// -using Foundation; -using System; -using System.CodeDom.Compiler; -using UIKit; - -namespace Bit.iOS.Extension -{ - [Register ("PasswordGeneratorViewController")] - partial class PasswordGeneratorViewController - { - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIView BaseView { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem CancelBarButton { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UINavigationItem NavItem { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIView OptionsContainer { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UILabel PasswordLabel { get; set; } - - [Outlet] - [GeneratedCode ("iOS Designer", "1.0")] - UIKit.UIBarButtonItem SelectBarButton { get; set; } - - [Action ("CancelBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void CancelBarButton_Activated (UIKit.UIBarButtonItem sender); - - [Action ("SelectBarButton_Activated:")] - [GeneratedCode ("iOS Designer", "1.0")] - partial void SelectBarButton_Activated (UIKit.UIBarButtonItem sender); - - void ReleaseDesignerOutlets () - { - if (BaseView != null) { - BaseView.Dispose (); - BaseView = null; - } - - if (CancelBarButton != null) { - CancelBarButton.Dispose (); - CancelBarButton = null; - } - - if (NavItem != null) { - NavItem.Dispose (); - NavItem = null; - } - - if (OptionsContainer != null) { - OptionsContainer.Dispose (); - OptionsContainer = null; - } - - if (PasswordLabel != null) { - PasswordLabel.Dispose (); - PasswordLabel = null; - } - - if (SelectBarButton != null) { - SelectBarButton.Dispose (); - SelectBarButton = null; - } - } - } -} \ No newline at end of file diff --git a/src/iOS.Extension/Properties/AssemblyInfo.cs b/src/iOS.Extension/Properties/AssemblyInfo.cs deleted file mode 100644 index 183860705..000000000 --- a/src/iOS.Extension/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BitwardeniOSExtension")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("8bit Solutions LLC")] -[assembly: AssemblyProduct("Bitwarden")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("32f5a2d6-f54d-4da1-ae26-0a980d48f422")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/iOS.Extension/Resources/Icon.png b/src/iOS.Extension/Resources/Icon.png deleted file mode 100644 index e4b594ad570d200ba1adf9feac9fca7dc3faf1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*Fy#+W|fyu0Yy&m;w&>@G7A9JW7K6 zf*BZ@m|0laIJkNF_yvVUM8zfK6%>`!H1&*(Eo_{eeZmscvkQuA8k(9r`e)2twRXd% zU5AgJI(Pp1&0F^#J$w23?fcJPzyJLGcje{(-+^Y{_jGX#u{izq%5}ab1BteW@{C9K ze!o}!e(%=r^{&fWy+XOz)#QH8y)fN|vk@5LLDebSa(TAQv~EcgiL%)8Q|evVFP}uF zFMl7(|C5@h`=IIA6n@n^wNbKmJrCAhKJ_V4x_r{KL#=U_K5gDDqv2Cv_LZH*a)axo zvo$Skifblm8S@?asxC51<(ZjS)AK)kZ<&kiG(PP5@KyBK)%ZJ_4DY#PB{Z&HxqOj- z{^wjxpXYtA5?`_`wse!)lX-m}&oN=IH@ok1ADEy2r^H!&hF-l=&V0tzC#Op95^?oz f&kQlz@tZ+o`{Q$G{_ULs^eTg=tDnm{r-UW|fe_5o diff --git a/src/iOS.Extension/Resources/Icon@2x.png b/src/iOS.Extension/Resources/Icon@2x.png deleted file mode 100644 index 37369f4d30a92c10d97f58da0390d8b205af2cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 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 ZzyRV@&z=+~`uP9=002ovPDHLkV1lt@Ndo`? diff --git a/src/iOS.Extension/Resources/ext-icon@2x.png b/src/iOS.Extension/Resources/ext-icon@2x.png deleted file mode 100644 index c2ea619de7510aaac92bd9ab3c36925c54d038b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmcJR`#%%OIWm)wVlI<=#4)BVI`KfxYr*hA-zcMVHZeI=dR)b@bh6ocrZHj z908BPpF1BN-ifyX03^t0d$`B7abEE&S4HPTDU}XjILrZj1}%3Y#0EWktLz65e0}IP z{jW=TCk3_1tNMDjOiv}@&8wdSOZ9;JVG2jZ738u-6FQ%~Xq_;+EEO8%LnfE#jny<0 zr9M=yve$Zf#JBb@U%!5BK`4l9J{Q%kdb6SPxhm;%mG^Q1dCZTqF*M zGul7}?Bx-Q}1DkiME-?(t+#k<~?Hs>U=sPU@~e{CPB32#PCJWDcmq)D1q) zf1~ELTlv%$Uiy_J6OOzhj>(FtZRdb~jPCO0x(hB^q*~~x$MICIPsVs8>PgdKlR0Hq zhfuFR>gst+o3f)-?Fo;}9iuwubmRH4A76__{5^}rN!Gw>yS$H#DI%&p_6I785TprS>7&3X7+t;^7wJ2O)C!1MXUU)oagh0KToh_x&>E>!`YNL@Z`q}B3nfH86P+jtt z$F(DD3X6)&_6nqt9BY@wHANr_ykle;5GB=F&cJ{IVx&tbv=fJ4rHI2qU?G5?_*ec# zs-jWQ2v}EFH)!qI=&zk1hP)~RZ4F?E$f^D-|Hc2w|L>Z;{Xac%_FdKyP@KQ-iyIn1 z?F+%dKt|u~%uHG7bZ^R)urSn@2bT9UjEs$wpu)EqYM|o5w+%V5b^&Ykp0&Q3bKsOr z&sKTe6!vw2AtI%R5t=I5{Hv9f%F^b)By+`YrCiW1YQK=Hrtm8w4bh`8p=+cW(kBg7b zgk)fTdtFWUHBss0LMOJ4VS7?^9X;PZi(2LG?8JTf@1*{ zmN&hkI9+%2Tpz9Hxy;;FIi?kDJlETdBtVje^Dy~2GXb1%<#GC@4-86%RZcvF zHk=B(fA5~-o5%80FKaYHuPv{#Y$<7&= zkUtF3W``BE8(j+O{M#JqgIxt>{GIP7Z>4RawSK#8;dp5-0nLon=VW*Mw$Ocpc4w5~ zGPzXNC8ksrdKXu%X21c(XatU*cX`ln>BM5zuy5+lk7#ooTDerE@iSFzOm&XUd}9|q zgz*FOF523ZW#zfbq$|@Dk2UHw8H$D1-1xE&d-m|s;rtIrBMd3Z;gH4XNW6q!AJfP~ zfd269=HO&75(B}METonWNafEq4s8$1{rP)yhG#K_G4?K1Hzu4khX&I~%0lU39#>aDY+m0H0;w zFM>8K4PK(;6y4GKMl(pYr!Hr=e2qJ6>g9ikQH^jq8Uofe8G$Tymmi~jjVnEl7*S{G zG+td^^99-)WV3yZJfbao%;9q_O)i48Y{C8bkEfiNTZqa7jO7H!;4VK4Vr@*ppjlf# z?G{Ge0M!o7D6xx6vk`L>AhaNDunStG)9*#~$~Esvs&ZD2m=ld@p-)$#00fXCx3#f4-3apH@cCDw8M`~*PfLjy?1#}Q{sLi{fGR@Nn&B-;Fgh8pEcf*) zQ+gE{nws*^ctl8~By}Lrog{nk_*Z9bZEaj=%)6M+3w{E=yD)`(p53*+n!388y|l#11W_mR%Ixf( z%9b4RistQ7=jQM@*&wup)os3V5?SV0#V>{_qHHn1LMB~0Z>gf~i+Xy$79kdB480Z+ zaR*EB0;>SwAr&dmI=xUy1?{OF7K_x6^sv*Fn<)CuK2Q4NU0ef##Ua4$DMOmdr=+~Peh`}_Dv4Hwzcrt_e> z5#v&Kb6d;HInpvRwBBA9ocdC-F2DL-IEmy@&m~B%IL3|Sw|4J7RW{}=FP|o+`hHf( zm#+WRwexr5C$s$LRBeI9TGR~w#3ua>)^K2I%Gq$AMWyn@#6;3yDL36!$$U7vn?wtE4lA-fH-oFuKhJWpN*;*59rF- z%7sLF*NY&uax6M3;dcUt)C;Qw8h-VwEkOs?4#Pxa!;wNaRtF==Bqx~QSD!K!52Pdi k%=hwP=c<1<5~>6OPE2JZMSp2y?|st%XrzmMEg~@CA2a=$xc~qF diff --git a/src/iOS.Extension/Resources/ext-icon@3x.png b/src/iOS.Extension/Resources/ext-icon@3x.png deleted file mode 100644 index 96e4d1ce05b6f3f6704fe980e3efcf74e8124e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3838 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 diff --git a/src/iOS.Extension/Resources/fingerprint.png b/src/iOS.Extension/Resources/fingerprint.png deleted file mode 100644 index 754e39825fd8395825478c1fe525130fee203235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3956 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 Rp0oe}002ovPDHLkV1f{CJm~-c diff --git a/src/iOS.Extension/Resources/logo.png b/src/iOS.Extension/Resources/logo.png deleted file mode 100644 index 33ced5b12e05df53eb268ec0870e26b07af9ee6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2593 zcmV++3f}dJP)e6IhGCzS&zeeRdw6)F=`gnN z@2ZzB7n2;X*r2Sn#zSf%neE}>iKgQaPd4A6H!>!l?T~~_ycr*cd3d7nC?uPEylml< z#vbnuJ{jCC1W=sk@$m2-O%J>c9fl-S$)Mdlh$k5jPc%IT-3AaIuiKo7EeJ^@Zto09 zM-bM!;QIv>Z$%JoSr&Z1E+ESk`v2td5IwptpDWpw_=OBI);bpRQU;xF(Z462XDr8IwuG0U+|5sr5i2F}0 zM-c8ei||j@KZE>4xRmpV>B((zEDi>3S)vS7IZROIL4i@=Y6h2G{e4b&y{F|Vn2b|R)9I)H>;^la!{*8hE`>W6Y9=Fi35jF zjw)hYAlJ2~-I-#E11v8VCA8OvC`Mlp&*yMwb$enT3JuQaI(<0*iV>EaS$Il&ROYJXfL- z-pOAmJaK(xDqmECSF<4PSQz|Py%sq{YU+{Gjx9p&^ZxJR$>h} zia6>~e`CWu4Gnu@g{(|Hntjb7uMM`2_0rr`Qqj0@Fs`89)H0NQbewMzpU#PBVx}@4 zN+x4pa3I!*Ly%LVl$kQAIpI?XZ&zZv>fza7K*m0g-&O=1^nV z-1A_Pk~qDO=to6SGA3D#h$ZXdVeBq#qLZ@+k?HZ)S??I!a)hnQ@e-|G z(~XF7ChQ(O>Ik1AhDW1@O=|cg$Y7d7G@-@=;t;lI*KH3&(l#*fyGJ7wW8Gk#MGq{+ zUY{z*9w)S1RmwCZGboXNjEXLPt9xdLv+Y2wbE6oWl#tqsQVuQmsUu!a(^&PLXfkvM zn;N`jjs@F7d-io4DaqXb@IJq&;%akw1979KC+g+(pBkhzeZ5t_ZR$ z2h+C+QMSxo6gGi|gr*vK$)si35^_jLM(&@v15YyV9v8$C)g87_OQzz!0cGPR(#lqq z`Zy`_R*pDf6Q>MddNfNyey00p+5|m6CTOtUUmCBm*F+;Qt8w6qNG5B@o8c@=m+hfR zdpgcLjrYL~n?Uh+0%fvsw;cpTwk~0E8xt$_$!c&X%X6MP$(Aa{CiQ+3IX>8R5>codZSA5u6Sv;*jJ} z@n$$-lj@0tN|>27WH4@9oGXtSf^LE=AC>6f-4Kln*#xNcPX+8N!=-IYeU|6F{(ZcD zuEk}^2nOy=mFt)blq`?jR-8wW4n zlq?e>-#PR&DSS~PSd*0j!L~n27+bD3^zFes(e8%^>WORa1Kq(JTGmNJFm8TE5{)FA z$S@3uaFV6aUY?8|BNBq$le&^DP5VF>YB=6&uZTvn=~t#;%De(m*5{TKC2_2`sf2ai zWEPVUWMCLJ>B1*dvbrOd{fXhBNDp}frz0iXOvvApzOI4)M7_*cM%ezZhV^D7!Wf`I zUmB40fP~ns;F8(NukioZJeXhw?LLrqhXZW-x)o_nl7`wT6>3vc`8yno&?0Q2WOX2N z zV}zb|Ks{dELqag}DK<ARR}l}) z$(||-ZX2q_@b>&%n~6Gyw=e4}@*?Q*t1m6jnFIFW1y0*(<|Rh>pfR>KrzXg#U`@y? zV&0oUdwEg#aCLQMbKeq*4>~@8*=gbn$q>Nl4TGUF7zy5E z+V;Hqfp`xl)>tah7~Z}goaS3nRQTAys}N<1;}~AS?tpC|mRfpAHe{SP2C{EE>{pf} z=RJeuLO3O?>++~0lCK)(^kb_TAK?joacEb7WyrdN9HWvLj!~5|le)IIB^o&qmI{-* zyqL?0XgoYTx(k;#RZ6er0ZuDTTkt!uJv=-V{3E~s8StLF2VlaO00000NkvXXu0mjf DpN-AC diff --git a/src/iOS.Extension/Resources/logo@2x.png b/src/iOS.Extension/Resources/logo@2x.png deleted file mode 100644 index 2a0ba60b9b13983200a2c921aa6793b3c1bf09ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5449 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 diff --git a/src/iOS.Extension/Resources/logo@3x.png b/src/iOS.Extension/Resources/logo@3x.png deleted file mode 100644 index 90473167697b867ede9400b31c6dce93b7e39ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8426 zcmXY01zeQR(?10%0S^#q5CKU^fg_F%siV83k&vVF0O>{vsRJaAPLWROZX^Xxq>hqq zc#r?@eV)(f+1c;T%+BoYv$M}Lk!lcm0z67Q002Os@J>bp0KkBt=@1+&^s`XJcNAS< z+DNKM0sxi$f={Bh(RB(pSv@yRCu=uPGZ!m>q@|O&)k_6OGaD-nD>F-P=K(8G0N|yc zf{dh=*TQZlQhTXkHar=8nKh61tN3MN%{5H<2|X#d7O)6_z5{cDl-WA`R$O_tfQ3Ps zTA#^UzubB0_a=b9x><>j35k6M&?>bh?5j34`J5hasy;y*fWDe9W7+cMjW;8mXV=?Q9*AXlL!qDiw|2jkHL`tlRBDWCE?k*bXr#zS3#5~-y@FyGPq_@VZW z5&n`6ujGLQ0FapfD*~baYXbDg&T2gh`CHk3H#rX&lBf@mB{bWB*kZL_9U6d5$h7Fu+LcMA zP655~CJI+&{+Um7&MvMyaf&KYvxCncy6(gU$c4X94#!xs`M4kI^E% zNo!M%!GlL=D=l)oS|E>?be~o;%{)azILrWYjBMUkK{WlKBv&1)rQXDyt;if*PsOu< z$oq3ne|f_r645Q%d23%nfrfz)Z-&!hiV%_*$+sU)9yQsQP@>TSK#mV!%~FmOO#@!S zAD$1a|CQ)&a1=<9d~KQ|Xn>p4MDqzC&#JU@-+cjxWz8?1S0@z*-GCO8cpBUln5!HF zZCaEDwRXy&(GIc)&xag4d`)p#Ry4kVfoKq|xr+HJ1_3OU@~Pc6khm247xn)>N<$q& z;!b=$5NgOy-~)!{C6TTKWfHQu{jfE7%0iZl`ya~9Qrfp8v6muSA#kpT%R0qu!j5i0 zTk+mjK<+~CP}BD&)&wzGs^pWrU7nEGW?1-=%M0-!OEUQdLpi#HKG0e&q(x?rwL+uA zj^sbtmz0LdoAgz?PUuMp+ya(h1B9xz;J+VM2znR-bwJJk-#g&V^C)gG8kPV(0{jTF z{r^b|#Q47bU^RL+zC9WJ_@E{Ka~$<*`zFQq!HTHKGnDS&N0suwS@v(A=sEr;B=PKw zh{vaLxDzM;``XIKVfTBla;i?e&d$5nXie|%a(uW+k@-(1N7hcq)=n=Eg}3R`lZXt5 zdRzC0+nI8Q&iTgOUsU6pYNys@_+zyIUW!{6jHSgl#CUXmKK}P7#*}FW*y5kJz{?Kd z_W0U6!1Y*gX{c`pb=ag+CPlE`VTAVr0jOU1X#@^^MmBc!-8$9zbl2&$J)o#i+vN%o z5Y0g4uI3f@tj^!j7*!N(Fo1`wJ9|GQVDIN{HiQ_ue1B(b!8v*uFi}OH-Bc$~!*gn+ zK34AGuyc0#6_3u4P@@lrnVj8q%`1h7>Z;NCM0KW;TWqT@lBn4tlV~QmLw#s0fSf2x znrhMg<)Ji|<2T2dlk2rw#jS{B8tUbZmAYGB3+f2NV_4k5#@&-oTSJp`J4o7t4ewSv zDxnwSgz?jN>{iEQgSr_W@ZgbdRP(b~nq=Rly#9tPcabXwiEMoVl)IQjhS$JX$9vs9 zS6B4n|H8*$uHjymt-@S{t!3@q><&+{TQcJvoC_Hen^nBy_{&`DD_iw~6OPv>62WA& zIYu2ep3N^vLUMI$L?th8PUpUSbZ?xQ#izLeB;k1$iL$Y#zEJ&iJ=8g!S)2BB#?k2@ zo+wr&TdSe9Zp3H#?LvV}oX3gwBJG&b+ukqZB#6*UxK-Cz-x(fX_)Faqn&5%Wklf

*?lVy@ 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 A`2YX_ diff --git a/src/iOS.Extension/Resources/smile.png b/src/iOS.Extension/Resources/smile.png deleted file mode 100644 index 25f2f45b1c9e513c403159ba8e1e9cf20a51a6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2017 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 diff --git a/src/iOS.Extension/Resources/smile@3x.png b/src/iOS.Extension/Resources/smile@3x.png deleted file mode 100644 index 6e7189e69c140b10692800db22501fcfc443b344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5468 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\\?]/mg,''):null;return[c?c:null,a.value]}),{options:a}):null}function r(a){var e;for(a=a.parentElement||a.parentNode;a&&'td'!=p(a.tagName);)a=a.parentElement||a.parentNode;if(!a|| - void 0===a)return null;e=a.parentElement||a.parentNode;if('tr'!=e.tagName.toLowerCase())return null;e=e.previousElementSibling;if(!e||'tr'!=(e.tagName+'').toLowerCase()||e.cells&&a.cellIndex>=e.cells.length)return null;a=e.cells[a.cellIndex];a=a.textContent||a.innerText;return a=x(a)}function s(a){var e,c=[];if(a.labels&&a.labels.length&&0b.clientWidth||10>b.clientHeight)return!1;var s=b.getClientRects();if(0===s.length)return!1;for(var g=0;gh||0>r.right)return!1;if(0>l||l>h||0>d||d>n)return!1;for(f=b.ownerDocument.elementFromPoint(l+(f.right>window.innerWidth?(window.innerWidth-l)/2:f.width/2),d+(f.bottom>window.innerHeight? - (window.innerHeight-d)/2:f.height/2));f&&f!==b&&f!==document;){if(f.tagName&&'string'===typeof f.tagName&&'label'===f.tagName.toLowerCase()&&b.labels&&0 - - - Debug - iPhoneSimulator - {32F5A2D6-F54D-4DA1-AE26-0A980D48F422} - {EE2C853D-36AF-4FDB-B1AD-8E90477E2198};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - Bit.iOS.Extension - BitwardeniOSExtension - Resources - Properties - - - - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - i386, x86_64 - None - True - Entitlements.plist - 9.3 - False - False - False - False - True - False - False - Default - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler - - - none - true - bin\iPhoneSimulator\Release - prompt - 4 - Full - i386, x86_64 - false - Entitlements.plist - 9.3 - False - False - False - False - False - False - True - Default - NSUrlSessionHandler - False - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARM64 - Entitlements.plist - iPhone Developer - True - - - - - None - False - False - False - False - False - True - False - False - --http-message-handler=NSUrlSessionHandler - 10.2 - Default - NSUrlSessionHandler - - - none - true - bin\iPhone\Release - prompt - 4 - Entitlements.plist - ARM64 - false - iPhone Developer - Full - False - False - False - False - False - False - True - False - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARM64 - Entitlements.plist - True - Automatic:AdHoc - iPhone Distribution - Full - False - False - False - False - False - False - True - False - NSUrlSessionHandler - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARM64 - Entitlements.plist - Automatic:AppStore - iPhone Distribution - Full - False - False - False - False - False - False - True - False - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - 10.2 - Default - NSUrlSessionHandler - - - 9.3 - Full - False - False - False - i386, x86_64 - False - False - False - True - Default - NSUrlSessionHandler - False - bin\iPhoneSimulator\Ad-Hoc - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - Entitlements.plist - - - 9.3 - Full - False - False - False - i386, x86_64 - False - False - False - True - Default - NSUrlSessionHandler - False - bin\iPhoneSimulator\AppStore - --http-message-handler=NSUrlSessionHandler --linkskip=BitwardeniOS --linkskip=BitwardeniOSCore --linkskip=BitwardeniOSExtension --linkskip=BitwardenApp --linkskip=SQLite-net - - - - - LockPasswordViewController.cs - - - - SetupViewController.cs - - - - LockPinViewController.cs - - - - LockFingerprintViewController.cs - - - - PasswordGeneratorViewController.cs - - - - LoginAddViewController.cs - - - - LoginListViewController.cs - - - - - - - - - LoadingViewController.cs - - - - - - - - - - - - - - - - Always - - - - - - - - - - - - - - - - - - - - {8a279ee4-4537-4656-9c93-44945e594556} - App - - - {B2538ADA-B605-4D6F-ACD2-62A409680F84} - iOS.Core - False - False - - - - - 4.4.0 - - - 2.0.5782 - - - - \ No newline at end of file diff --git a/src/iOS/AppDelegate.cs b/src/iOS/AppDelegate.cs deleted file mode 100644 index 23f02c24c..000000000 --- a/src/iOS/AppDelegate.cs +++ /dev/null @@ -1,409 +0,0 @@ -using System; -using XLabs.Ioc; -using Foundation; -using UIKit; -using Bit.App.Abstractions; -using Bit.App.Services; -using Bit.iOS.Services; -using Plugin.Connectivity; -using Bit.App.Repositories; -using Plugin.Fingerprint; -using Plugin.Settings.Abstractions; -using System.Diagnostics; -using Xamarin.Forms; -using Bit.iOS.Core.Services; -using Plugin.Connectivity.Abstractions; -using Bit.App.Pages; -using HockeyApp.iOS; -using Bit.iOS.Core; -using SimpleInjector; -using XLabs.Ioc.SimpleInjectorContainer; -using CoreNFC; -using Bit.App.Resources; -using AuthenticationServices; -using System.Threading.Tasks; -using Bit.App.Models; -using System.Linq; -using System.Collections.Generic; -using Bit.iOS.Core.Utilities; - -namespace Bit.iOS -{ - [Register("AppDelegate")] - public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate - { - private NFCNdefReaderSession _nfcSession = null; - private ILockService _lockService; - private IDeviceInfoService _deviceInfoService; - private ICipherService _cipherService; - private iOSPushNotificationHandler _pushHandler = null; - private NFCReaderDelegate _nfcDelegate = null; - - public ISettings Settings { get; set; } - - public override bool FinishedLaunching(UIApplication app, NSDictionary options) - { - Forms.Init(); - - if(!Resolver.IsSet) - { - SetIoc(); - } - - _lockService = Resolver.Resolve(); - _deviceInfoService = Resolver.Resolve(); - _cipherService = Resolver.Resolve(); - _pushHandler = new iOSPushNotificationHandler(Resolver.Resolve()); - _nfcDelegate = new NFCReaderDelegate((success, message) => ProcessYubikey(success, message)); - var appIdService = Resolver.Resolve(); - - var crashManagerDelegate = new HockeyAppCrashManagerDelegate( - appIdService, Resolver.Resolve()); - var manager = BITHockeyManager.SharedHockeyManager; - manager.Configure("51f96ae568ba45f699a18ad9f63046c3", crashManagerDelegate); - manager.CrashManager.CrashManagerStatus = BITCrashManagerStatus.AutoSend; - manager.UserId = appIdService.AppId; - manager.StartManager(); - manager.Authenticator.AuthenticateInstallation(); - manager.DisableMetricsManager = manager.DisableFeedbackManager = manager.DisableUpdateManager = true; - - LoadApplication(new App.App( - null, - Resolver.Resolve(), - Resolver.Resolve(), - Resolver.Resolve(), - Resolver.Resolve(), - Resolver.Resolve(), - _lockService, - Resolver.Resolve(), - Resolver.Resolve(), - Resolver.Resolve(), - Resolver.Resolve())); - - // Appearance stuff - - var primaryColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f); - var grayLight = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); - - UINavigationBar.Appearance.ShadowImage = new UIImage(); - UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default); - UIBarButtonItem.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor; - UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).SetTitleColor(primaryColor, - UIControlState.Normal); - UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor; - UIStepper.Appearance.TintColor = grayLight; - UISlider.Appearance.TintColor = primaryColor; - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "ShowAppExtension", (sender, page) => - { - var itemProvider = new NSItemProvider(new NSDictionary(), Core.Constants.UTTypeAppExtensionSetup); - var extensionItem = new NSExtensionItem(); - extensionItem.Attachments = new NSItemProvider[] { itemProvider }; - var activityViewController = new UIActivityViewController(new NSExtensionItem[] { extensionItem }, null); - activityViewController.CompletionHandler = (activityType, completed) => - { - page.EnabledExtension(completed && activityType == "com.8bit.bitwarden.find-login-action-extension"); - }; - - var modal = UIApplication.SharedApplication.KeyWindow.RootViewController.ModalViewController; - if(activityViewController.PopoverPresentationController != null) - { - activityViewController.PopoverPresentationController.SourceView = modal.View; - var frame = UIScreen.MainScreen.Bounds; - frame.Height /= 2; - activityViewController.PopoverPresentationController.SourceRect = frame; - } - - modal.PresentViewController(activityViewController, true, null); - }); - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "ListenYubiKeyOTP", (sender, listen) => - { - if(_deviceInfoService.NfcEnabled) - { - _nfcSession?.InvalidateSession(); - _nfcSession?.Dispose(); - _nfcSession = null; - if(listen) - { - _nfcSession = new NFCNdefReaderSession(_nfcDelegate, null, true); - _nfcSession.AlertMessage = AppResources.HoldYubikeyNearTop; - _nfcSession.BeginSession(); - } - } - }); - - UIApplication.SharedApplication.StatusBarHidden = false; - UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent; - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "ShowStatusBar", (sender, show) => - { - UIApplication.SharedApplication.SetStatusBarHidden(!show, false); - }); - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "FullSyncCompleted", async (sender, successfully) => - { - if(_deviceInfoService.Version >= 12 && successfully) - { - await ASHelpers.ReplaceAllIdentities(_cipherService); - } - }); - - MessagingCenter.Subscribe>( - Xamarin.Forms.Application.Current, "UpsertedCipher", async (sender, data) => - { - if(_deviceInfoService.Version >= 12) - { - if(await ASHelpers.IdentitiesCanIncremental()) - { - if(data.Item2) - { - var identity = await ASHelpers.GetCipherIdentityAsync(data.Item1, _cipherService); - if(identity == null) - { - return; - } - await ASCredentialIdentityStore.SharedStore?.SaveCredentialIdentitiesAsync( - new ASPasswordCredentialIdentity[] { identity }); - return; - } - } - await ASHelpers.ReplaceAllIdentities(_cipherService); - } - }); - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "DeletedCipher", async (sender, cipher) => - { - if(_deviceInfoService.Version >= 12) - { - if(await ASHelpers.IdentitiesCanIncremental()) - { - var identity = ASHelpers.ToCredentialIdentity(cipher); - if(identity == null) - { - return; - } - await ASCredentialIdentityStore.SharedStore?.RemoveCredentialIdentitiesAsync( - new ASPasswordCredentialIdentity[] { identity }); - return; - } - await ASHelpers.ReplaceAllIdentities(_cipherService); - } - }); - - MessagingCenter.Subscribe( - Xamarin.Forms.Application.Current, "LoggedOut", async (sender) => - { - if(_deviceInfoService.Version >= 12) - { - await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync(); - } - }); - - ZXing.Net.Mobile.Forms.iOS.Platform.Init(); - return base.FinishedLaunching(app, options); - } - - public override void DidEnterBackground(UIApplication uiApplication) - { - var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) - { - Tag = 4321 - }; - - var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) - { - BackgroundColor = new UIColor(red: 0.93f, green: 0.94f, blue: 0.96f, alpha: 1.0f) - }; - - var imageView = new UIImageView(new UIImage("logo.png")) - { - Center = new CoreGraphics.CGPoint(view.Center.X, view.Center.Y - 30) - }; - - view.AddSubview(backgroundView); - view.AddSubview(imageView); - - UIApplication.SharedApplication.KeyWindow.AddSubview(view); - UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view); - UIApplication.SharedApplication.KeyWindow.EndEditing(true); - UIApplication.SharedApplication.SetStatusBarHidden(true, false); - - // Log the date/time we last backgrounded - _lockService.UpdateLastActivity(); - - // Dispatch Google Analytics - SendGoogleAnalyticsHitsInBackground(); - - base.DidEnterBackground(uiApplication); - Debug.WriteLine("DidEnterBackground"); - } - - public override void OnResignActivation(UIApplication uiApplication) - { - base.OnResignActivation(uiApplication); - Debug.WriteLine("OnResignActivation"); - } - - public override void WillTerminate(UIApplication uiApplication) - { - base.WillTerminate(uiApplication); - Debug.WriteLine("WillTerminate"); - } - - public override void OnActivated(UIApplication uiApplication) - { - base.OnActivated(uiApplication); - Debug.WriteLine("OnActivated"); - - UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; - - var view = UIApplication.SharedApplication.KeyWindow.ViewWithTag(4321); - if(view != null) - { - view.RemoveFromSuperview(); - UIApplication.SharedApplication.SetStatusBarHidden(false, false); - } - } - - public override void WillEnterForeground(UIApplication uiApplication) - { - SendResumedMessage(); - - base.WillEnterForeground(uiApplication); - Debug.WriteLine("WillEnterForeground"); - } - - public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, - NSObject annotation) - { - return true; - } - - public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error) - { - _pushHandler?.OnErrorReceived(error); - } - - public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) - { - _pushHandler?.OnRegisteredSuccess(deviceToken); - } - - public override void DidRegisterUserNotificationSettings(UIApplication application, - UIUserNotificationSettings notificationSettings) - { - application.RegisterForRemoteNotifications(); - } - - public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, - Action completionHandler) - { - _pushHandler?.OnMessageReceived(userInfo); - } - - public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo) - { - _pushHandler?.OnMessageReceived(userInfo); - } - - private void SendResumedMessage() - { - MessagingCenter.Send(Xamarin.Forms.Application.Current, "Resumed", false); - } - - private void SetIoc() - { - var container = new Container(); - - // Services - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterInstance(new DeviceInfoService()); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - - // Repositories - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - - // Other - container.RegisterInstance(CrossConnectivity.Current); - container.RegisterInstance(CrossFingerprint.Current); - - Settings = new Settings("group.com.8bit.bitwarden"); - container.RegisterInstance(Settings); - - // Push - container.RegisterSingleton(); - container.RegisterSingleton(); - - FFImageLoading.Forms.Platform.CachedImageRenderer.Init(); - Resolver.SetResolver(new SimpleInjectorResolver(container)); - } - - ///

- /// This method sends any queued hits when the app enters the background. - /// ref: https://developers.google.com/analytics/devguides/collection/ios/v3/dispatch - /// - private void SendGoogleAnalyticsHitsInBackground() - { - var taskExpired = false; - var taskId = UIApplication.SharedApplication.BeginBackgroundTask(() => - { - taskExpired = true; - }); - - if(taskId == UIApplication.BackgroundTaskInvalid) - { - return; - } - } - - private void ProcessYubikey(bool success, string message) - { - if(success) - { - Device.BeginInvokeOnMainThread(() => - { - MessagingCenter.Send(Xamarin.Forms.Application.Current, "GotYubiKeyOTP", message); - }); - } - } - } -} diff --git a/src/iOS/Controls/ContentPageRenderer.cs b/src/iOS/Controls/ContentPageRenderer.cs deleted file mode 100644 index afff68785..000000000 --- a/src/iOS/Controls/ContentPageRenderer.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Bit.iOS.Controls; -using UIKit; -using Xamarin.Forms; -using Xamarin.Forms.Platform.iOS; - -[assembly: ExportRenderer(typeof(ContentPage), typeof(ContentPageRenderer))] -namespace Bit.iOS.Controls -{ - public class ContentPageRenderer : PageRenderer - { - public override void ViewWillAppear(bool animated) - { - base.ViewWillAppear(animated); - - var contentPage = Element as ContentPage; - if(contentPage == null || NavigationController == null) - { - return; - } - - var itemsInfo = contentPage.ToolbarItems; - - var navigationItem = NavigationController.TopViewController.NavigationItem; - var leftNativeButtons = (navigationItem.LeftBarButtonItems ?? new UIBarButtonItem[] { }).ToList(); - var rightNativeButtons = (navigationItem.RightBarButtonItems ?? new UIBarButtonItem[] { }).ToList(); - - var newLeftButtons = new List(); - var newRightButtons = new List(); - - rightNativeButtons.ForEach(nativeItem => - { - // Use reflection to get Xamarin private field "_item" - var field = nativeItem.GetType().GetField("_item", BindingFlags.NonPublic | BindingFlags.Instance); - if(field == null) - { - return; - } - - var info = field.GetValue(nativeItem) as ToolbarItem; - if(info == null) - { - return; - } - - if(info.Priority < 0) - { - newLeftButtons.Add(nativeItem); - } - else - { - newRightButtons.Add(nativeItem); - } - }); - - leftNativeButtons.ForEach(nativeItem => - { - newLeftButtons.Add(nativeItem); - }); - - navigationItem.RightBarButtonItems = newRightButtons.ToArray(); - navigationItem.LeftBarButtonItems = newLeftButtons.ToArray(); - } - } -} diff --git a/src/iOS/Controls/CustomButtonRenderer.cs b/src/iOS/Controls/CustomButtonRenderer.cs deleted file mode 100644 index d54a44465..000000000 --- a/src/iOS/Controls/CustomButtonRenderer.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Bit.iOS.Controls; -using UIKit; -using Xamarin.Forms; -using Xamarin.Forms.Platform.iOS; -using System.ComponentModel; - -[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))] -namespace Bit.iOS.Controls -{ - public class CustomButtonRenderer : ButtonRenderer - { - protected override void OnElementChanged(ElementChangedEventArgs