Compare commits

...

1431 Commits

Author SHA1 Message Date
André Bispo
b867079ced [PM-6702] Add AppLink support to open links sent to email to complete account registration 2024-06-21 12:25:23 +01:00
André Bispo
56e68361a6 Merge branch 'main' into pm-6701/email-verification-selfhost-registration
# Conflicts:
#	.github/workflows/scan.yml
#	app/build.gradle.kts
#	app/src/main/java/com/x8bit/bitwarden/BitwardenApplication.kt
#	app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt
#	app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt
#	app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/di/PlatformDiskModule.kt
#	app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/di/PlatformNetworkModule.kt
#	app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/Retrofits.kt
#	app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsImpl.kt
#	app/src/main/java/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/auth/AuthNavigation.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountScreen.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModel.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingNavigation.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreen.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModel.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultScreen.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt
#	app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModel.kt
#	app/src/main/res/values/strings.xml
#	app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt
#	app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsTest.kt
#	app/src/test/java/com/x8bit/bitwarden/data/platform/manager/AppForegroundManagerTest.kt
#	app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreenTest.kt
#	app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModelTest.kt
#	build.gradle.kts
#	gradle/libs.versions.toml
2024-06-21 11:57:21 +01:00
André Bispo
2556217432 [PM-6702] Fix clickable text font weight 2024-06-19 16:33:05 +01:00
André Bispo
fe9c7794ce [PM-6702] Fix password strength indicator component package name 2024-06-19 16:32:11 +01:00
André Bispo
9b662eccd4 Merge branch 'main' into pm-6701/email-verification-selfhost-registration 2024-06-19 16:06:39 +01:00
André Bispo
fa8a5b80a2 [PM-6702] Add Check your email screen used for cloud registration flow. 2024-06-19 16:02:40 +01:00
David Perez
eb90069b90 [AC-2787] Remove the unassigned items dialog (#1466) 2024-06-19 10:01:33 -05:00
David Perez
ef03aa0cb8 Set all multiipart request MIME types to 'multipart/form-data' (#1467) 2024-06-19 09:56:38 -05:00
David Perez
37a53d42d4 Remove legacy GCM notification support (#1464) 2024-06-18 14:30:24 -05:00
David Perez
3ea15e3d9f Remove unused beta icons (#1465) 2024-06-18 13:58:06 -05:00
David Perez
b1d06ccdc3 Add beta icons (#1463) 2024-06-18 11:55:02 -05:00
David Perez
a5f8fe13c4 Clean up the PushManager (#1462) 2024-06-18 10:31:58 -05:00
renovate[bot]
818aaed0e3 [deps]: Update gh minor (#1457)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-18 09:58:35 -05:00
renovate[bot]
ac85af7d7b [deps]: Lock file maintenance (#1459)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-18 09:58:20 -05:00
David Perez
faa61990eb Update AGP and Gradle (#1461) 2024-06-18 09:33:44 -05:00
David Perez
a0dd14f1fa Update the Bitwarden SDK (#1460) 2024-06-18 09:14:23 -05:00
David Perez
7e61ab5e1d Add support for the FCMv1 format in push notifications (#1456) 2024-06-18 09:10:32 -05:00
André Bispo
53430cdf8a [PM-8947] Add marketing toggle and rewrite terms and conditions UI 2024-06-17 21:25:02 +01:00
André Bispo
da27115906 [PM-6701] Add Complete Registration screen 2024-06-17 21:23:22 +01:00
David Perez
fe46dc5274 BIT-2409: Update the attachment migration process (#1454) 2024-06-17 11:28:03 -05:00
David Perez
18abbdd05d Update strings localization (#1455) 2024-06-17 11:00:30 -05:00
David Perez
cd6419bc9e Update the Bitwarden SDK (#1453) 2024-06-14 15:07:10 -05:00
David Perez
3c75f22d4a Update AGP to v8.4.2 (#1451) 2024-06-13 10:33:21 -05:00
David Perez
c9f8178373 BIT-2409: Update attachment migration logic when sharing a cipher (#1447) 2024-06-13 09:35:31 -05:00
David Perez
4ddfc349ed Update the Camera library to 1.3.4 (#1450) 2024-06-13 09:32:56 -05:00
Patrick Honkonen
0b9498b56e [PM-8137] Populate add cipher form during passkey creation (#1431) 2024-06-13 14:11:30 +00:00
Patrick Honkonen
a09b82c97b Allow test workflow to be triggered manually (#1449) 2024-06-13 09:47:36 -04:00
David Perez
ff423c655b Update Compose BOM to the latest version (2024.06.00) (#1448) 2024-06-13 08:44:37 -05:00
Patrick Honkonen
9ff5426e20 Update Bitwarden SDK (#1444) 2024-06-12 11:45:21 -04:00
David Perez
ffcaaa6f67 Add migration logic for cipher attachments (#1446) 2024-06-11 17:07:09 -05:00
renovate[bot]
b9f809462d [deps]: Lock file maintenance (#1437) 2024-06-11 16:52:17 -04:00
renovate[bot]
4fd0c2a404 [deps]: Update ruby/setup-ruby action to v1.179.1 (#1436) 2024-06-11 16:49:17 -04:00
David Perez
f4ccb2af5c Ensure collection IDs are maintained when restoring a cipher (#1445) 2024-06-11 14:39:32 -05:00
David Perez
965f46967d BIT-2420: Add attachments to cipher update requests (#1443) 2024-06-11 14:26:33 -05:00
David Perez
141bd815a1 BIT-2355: Check to see if a cipher needs to be migrated when encrypting the cipher (#1442) 2024-06-11 12:55:03 -05:00
Michał Chęciński
0288c6bf78 [BRE-101] Remove dept-devops from CODEOWNERS (#1433) 2024-06-11 11:11:21 -04:00
David Perez
4061f80d17 Simplify the restoreCipher API (#1441) 2024-06-10 17:13:28 -05:00
David Perez
eb503e70bd Update Kotlin serialization to latest version (1.7.0) (#1440) 2024-06-10 12:27:04 -05:00
David Perez
eef19411aa Update to latest ksp (2.0.0-1.0.22) (#1439) 2024-06-10 11:41:02 -05:00
David Perez
c4041615a7 Update to Kover 0.8.1 (#1438) 2024-06-10 11:06:53 -05:00
David Perez
281fdf98c3 Update to latest version of the SDK (#1430) 2024-06-07 12:21:11 -05:00
David Perez
afa76c4e6e Add private helpers for attachments that return a result (#1434) 2024-06-07 11:13:57 -05:00
David Perez
3c3ef583b9 Create manager class to isolate logic for ciphers (#1432) 2024-06-07 10:35:48 -05:00
David Perez
f6729c7b21 Update moveToOrganization to be 1-to-1 with the SDK (#1429) 2024-06-06 11:11:29 -05:00
Patrick Honkonen
4324607407 [PM-8137] Passkey creation navigation and account switching (#1380) 2024-06-06 11:36:44 -04:00
renovate[bot]
517229f552 [deps]: Update ruby/setup-ruby action to v1.179.0 (#1427) 2024-06-05 13:30:25 -04:00
renovate[bot]
3362ae8b92 [deps]: Lock file maintenance (#1428) 2024-06-05 12:35:50 -04:00
David Perez
99827d204d Update strings in the app (#1425) 2024-06-05 10:52:39 -05:00
renovate[bot]
89855c5700 [deps]: Lock file maintenance (#1407) 2024-06-05 11:39:55 -04:00
Patrick Honkonen
9869f4f4b8 Only distribute F-Droid to Firebase when requested (#1426) 2024-06-05 11:38:50 -04:00
Patrick Honkonen
3f7aa27de0 Publish beta builds to play store when requested (#1424) 2024-06-05 10:17:30 -04:00
Patrick Honkonen
0eb436b7ac Cleanup production build steps (#1423) 2024-06-04 17:50:59 -05:00
Patrick Honkonen
ac327735cd Move credential provider service declaration to standardDebug manifest (#1422) 2024-06-04 16:26:35 -05:00
David Perez
58c6f0f550 BIT-2403: Update process for moving item to organization (#1421) 2024-06-04 11:38:39 -05:00
Patrick Honkonen
d51c8d0c46 [BIT-2275] Fix OutOfMemoryException when saving attachments (#1418) 2024-06-04 16:17:24 +00:00
David Perez
0ec731532a Bump version name to 2024.06.0 (#1420) 2024-06-04 10:35:46 -05:00
David Perez
7e440a8f3e BIT-2402: Add Keep annotation to services used in the BitwardenAppComponentFactory (#1419) 2024-06-03 16:35:19 -05:00
Patrick Honkonen
95156b044b [BIT-2358] Generate username automatically when creating a new login (#1390) 2024-06-03 10:36:05 -04:00
Matt Bishop
8124467b7d Improve test caching (#1417) 2024-05-31 17:42:38 -04:00
Patrick Honkonen
ba9bc7b1f4 Fix various unused property param warnings (#1415) 2024-05-31 17:38:14 -04:00
Matt Bishop
9ec46cadc6 Upgrade Gradle wrapper (#1416) 2024-05-31 16:06:28 -04:00
David Perez
151af7b825 Update Firebase BOM to latest version v33.1.0 (#1414) 2024-05-31 11:35:06 -05:00
David Perez
8fcd16a62a Update the Bitwarden SDK to 0.5.0 (#1413) 2024-05-31 10:40:55 -05:00
David Perez
bb523812ff Change BaseTheme to use AppCompat parent (#1412) 2024-05-31 09:56:36 -05:00
David Perez
404f37144f Clear focus whenever the root navigation changes (#1411) 2024-05-30 16:23:36 -05:00
André Bispo
bc44043bfc [PM-6701] Add start registration screen and all the navigation logic necessary in landing screen 2024-05-30 22:14:43 +01:00
André Bispo
a417e5cc11 [PM-6701] Extract environment selector to its own file for reusability 2024-05-30 22:12:05 +01:00
David Perez
d117d6b6be Update Google Services Plugin (#1410) 2024-05-30 13:50:26 -05:00
David Perez
7c9f9d57de Update AppCompat to 1.7.0 (#1409) 2024-05-30 12:57:29 -05:00
Matt Bishop
0548661137 Checkmarx configuration (#1408) 2024-05-30 13:23:27 -04:00
renovate[bot]
82ff879470 [deps]: Update ruby/setup-ruby action to v1.178.0 (#1405)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-30 12:41:17 -04:00
Matt Bishop
69dfc9d622 Set token as environment variable for Gradle (#1404) 2024-05-30 11:48:29 -04:00
Matt Bishop
376008dd0b Ask for packages permissions (#1403) 2024-05-30 11:20:07 -04:00
Matt Bishop
d442edfda5 Repo tuneup (#1400) 2024-05-30 11:01:05 -04:00
David Perez
4deb181758 Reorder buttons in BitwardenTwoButtonDialog (#1402) 2024-05-29 17:56:16 -05:00
David Perez
f43a8c8ab4 Clear focus when the Activity stops (#1401) 2024-05-29 17:27:16 -05:00
David Perez
5c1a20e6c6 Update gemfile.lock (#1399) 2024-05-29 10:43:06 -05:00
David Perez
303027dfcf Update to Kotlin 2.0.0 (#1397) 2024-05-29 10:36:35 -05:00
Patrick Honkonen
4d1eb7f4d0 [BIT-2361] Display account deletion error message provided by network response (#1389) 2024-05-29 08:51:16 -04:00
David Perez
92f5580475 Add suppression for unstable API (#1398) 2024-05-28 17:55:58 -05:00
David Perez
ef89f25f3d Update Kover to 0.8.0. (#1396) 2024-05-28 16:44:47 -05:00
David Perez
1cb9c926ba Fix minor formatting in readme (#1395) 2024-05-28 11:55:27 -05:00
David Perez
2814b2dfcb Update Mockk and Robolectric test tools (#1394) 2024-05-28 10:19:45 -05:00
renovate[bot]
944e8b706b [deps]: Update gh minor (#1392)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-28 08:53:28 -05:00
David Perez
8e1f4100a8 Clear crypto on logout (#1391) 2024-05-24 16:44:44 -05:00
David Perez
310c452f0e Restart activity to clear out in-memory data when locking or changing user (#1388) 2024-05-24 15:03:08 -05:00
David Perez
024020ffcb Add manager that hints to the garbage collector to collect the garbage (#1387) 2024-05-24 11:07:31 -05:00
David Perez
4c21624b73 Clear passwordToCheck at appropriate times (#1385) 2024-05-23 16:34:33 -05:00
Brian Yencho
ae7841c770 Use isolated per-item scopes for TOTP flows (#1384) 2024-05-23 12:01:21 -05:00
David Perez
44b815d6b1 Update to AGP 8.4.1 (#1383) 2024-05-23 11:36:44 -05:00
David Perez
df0f0ef162 Remove LoginState from savedStateHandle (#1382) 2024-05-23 09:33:51 -05:00
David Perez
35e5d235b0 Pass in minimal data to avoid extra recompositions (#1381) 2024-05-22 14:04:13 -05:00
Patrick Honkonen
7c4e82acd1 PM-5153: Implement FIDO2 credential provider service (passkey creation entries) (#1370) 2024-05-20 12:01:35 -04:00
David Perez
7ef0c8d3bf Fix memory leak by using activity lifecycle scope (#1378) 2024-05-16 10:06:07 -05:00
David Perez
01654379f6 Add remember to viewmodel events to ensure optimal recompositions (#1379) 2024-05-16 10:03:28 -05:00
David Perez
7e15b43c97 Add suppression for maxLineLength (#1376) 2024-05-15 15:38:28 -05:00
Patrick Honkonen
7535f5bfc2 Group compose compiler updates with other Kotlin dependencies (#1375) 2024-05-15 11:38:03 -04:00
David Perez
4427c322e5 Update kotlin to v1.9.24 (#1373) 2024-05-14 16:21:12 -05:00
David Perez
405b62cca3 Replace last usage of ClickableText with BitwardenClickableText (#1374) 2024-05-14 16:19:01 -05:00
David Perez
23e12a5919 BIT-2318: Master password leak (#1372) 2024-05-14 13:28:24 -05:00
David Perez
b8509ade6a BIT-2258: Update slider navigation to work with emulator (#1371) 2024-05-14 11:28:10 -05:00
David Perez
c61f182cb5 Update Coroutines to v1.8.1 (#1369) 2024-05-13 15:11:10 -05:00
David Perez
9b8c1b557f Update compose compiler to 1.5.13 (#1368) 2024-05-13 15:10:48 -05:00
David Perez
4fd97aa110 BIT-1843: Redact access token in request header logs (#1367) 2024-05-13 14:22:52 -05:00
David Perez
7f3981207f BIT-2258: Update 'Enter key manually' button for keyboard navigation (#1366) 2024-05-13 13:56:06 -05:00
David Perez
dc96d0339b Add keyboard navigation logic for password fields to handle the tab button (#1365) 2024-05-13 13:28:27 -05:00
David Perez
92d0979884 Add explicit title to reset password screen dialogs (#1364) 2024-05-13 12:49:56 -05:00
renovate[bot]
d44412cbbb [deps]: Update com.google.firebase.crashlytics to v3 (#1362)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-13 11:30:34 -05:00
David Perez
092060be95 Add support for keyboard navigation with the slider (#1363) 2024-05-13 11:29:51 -05:00
renovate[bot]
c936f4797a [deps]: Update gh minor (#1359)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-13 12:04:34 -04:00
renovate[bot]
f0aceae113 [deps]: Update com.android.application to v8.4.0 (#1361)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-13 10:54:06 -05:00
Caleb Derosier
d3001281cd Change Create Account span texts to buttons for keyboard nav (#1357) 2024-05-13 08:49:56 -06:00
David Perez
5e2d86304d BIT-2287: Display a dialog for unassigned items (#1358) 2024-05-13 09:11:26 -05:00
David Perez
555702b08e Clean up VaultScreen Dialogs (#1356) 2024-05-10 12:59:21 -05:00
David Perez
9b497668e1 BIT-2318: Clear input when VaultUnlockViewModel is cleared (#1355) 2024-05-10 11:59:54 -05:00
Caleb Derosier
ec2fcb3701 BIT-2342: Hide verification codes for items with password reprompt (#1353) 2024-05-09 16:31:37 -06:00
David Perez
78754a1bfa Update the app with the latest strings (#1354) 2024-05-09 17:07:54 -05:00
David Perez
55eded4e61 Standardize the way we collect ViewModel state with collectAsStateWithLifecycle() (#1352) 2024-05-09 13:44:07 -05:00
Patrick Honkonen
e3e719ba75 Suppress the unresolved Autofill service name warning (#1351) 2024-05-09 14:30:15 -04:00
Patrick Honkonen
423af01f6e PM-6947: Correct Firebase credential file path (#1349) 2024-05-09 14:29:53 -04:00
Ramsey Smith
ddb680c210 BIT-2335: Onboarding flow (data) (#1346) 2024-05-09 10:44:30 -06:00
Caleb Derosier
b0691d7620 BIT-2345: Add error message when user needs to reenable biometrics (#1347) 2024-05-09 09:48:34 -06:00
Patrick Honkonen
01f05fca29 PM-7156: Publish Play Store and F-Droid artifacts (#1273) 2024-05-08 23:27:16 -04:00
Caleb Derosier
6180299d86 BIT-2170: Fix biometric bypass (#1324) 2024-05-08 11:19:54 -06:00
Patrick Honkonen
9cb3c8a178 Add missing param to F-Droid implementation of CrashLogsManager (#1345) 2024-05-07 15:24:41 -04:00
David Perez
4151dd72d9 Update app version to 2024.05.0 (#1344) 2024-05-07 13:43:26 -05:00
David Perez
1dc1306502 Update Firebase to latest version (#1343) 2024-05-07 13:03:01 -05:00
David Perez
dfb39d1a5f Update AndroidX Compose and Core to latest versions (#1342) 2024-05-07 13:01:17 -05:00
David Perez
a76418986a Update dependency names and alphabetization (#1337) 2024-05-06 09:37:57 -05:00
David Perez
93882905a3 Clear vault data in memory when the vault is locked (#1339) 2024-05-06 08:34:53 -05:00
David Perez
904f891d66 Ensure BitwardenAppComponentFactory is call correct super methods (#1338) 2024-05-03 14:22:28 -05:00
David Perez
958f0590f7 BIT-2307: Add logic to migrate crash logging behavior (#1335) 2024-05-03 10:39:33 -05:00
David Perez
61a6ee5c03 Update AppComponentFactory (#1336) 2024-05-03 10:39:03 -05:00
Caleb Derosier
d2365a3372 BIT-2267: Fix incorrect element IDs on add / edit page (#1332) 2024-05-03 08:58:21 -05:00
Patrick Honkonen
6076685666 Declare ruby version globally (#1333) 2024-05-02 19:28:56 -04:00
David Perez
12bfb71eb9 Update to latest strings (#1330) 2024-05-02 11:31:24 -05:00
David Perez
ed44ec2685 Optimize when statement in EnvironmentUrlDataJsonExtensions (#1331) 2024-05-02 10:50:46 -05:00
David Perez
b52d11f389 BIT-2306: Use legacy autofill service name to enforce compatibility after migration (#1328) 2024-05-02 10:13:29 -05:00
David Perez
d77e9bc5c6 BIT-2305: Update default environment URLs to match legacy data (#1329) 2024-05-02 09:26:49 -05:00
David Perez
607417a7bc Clean up QrCodeScanScreen to avoid test error action (#1327) 2024-05-01 17:25:26 -05:00
David Perez
9a45c445b4 BIT-2283: Add the unassigned ciphers API (#1326) 2024-05-01 10:59:32 -05:00
David Perez
8c7217920c BIT-2295: Simplify the pending requests UI (#1325) 2024-05-01 10:59:05 -05:00
David Perez
3be55288dc Simplify and rename the hasManualUnlockMechanism helper (#1322) 2024-04-30 15:51:14 -05:00
David Perez
0d398a4b5f BIT-2251: Fix pending login request UI scrolling (#1323) 2024-04-30 15:50:47 -05:00
Caleb Derosier
deaa45e3fd BIT-2269: Make all lists in Composables immutable (#1319) 2024-04-30 13:47:26 -06:00
David Perez
6c9e56c461 Allow user with untrusted device to unlock vault if they have a means to do so (#1321) 2024-04-30 13:17:01 -05:00
David Perez
7d7b304952 BIT-2291: use org IDs when unlocking vault for new TDE user (#1320) 2024-04-30 12:22:37 -05:00
David Perez
4b29eb734a BIT-2180: Check htmlInfo for username field (#1318) 2024-04-29 16:01:28 -05:00
David Perez
1565ab0757 Update AndroidX dependencies (#1317) 2024-04-29 12:06:00 -05:00
David Perez
9a6ac3fca1 Apply the RobolectricTestRunner to the BaseRobolectricTest (#1316) 2024-04-29 11:46:49 -05:00
renovate[bot]
d761f891b8 [deps]: Update gh minor (#1315)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-29 09:34:00 -05:00
renovate[bot]
4721dbff2b [deps]: Update androidx.compose:compose-bom to v2024.04.01 (#1314)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-29 09:33:07 -05:00
Ramsey Smith
db3ffb7932 BIT-2214: Sync complete toast (#1305) 2024-04-29 09:05:15 -05:00
David Perez
0b4847cad8 BIT-2297: Update the values for UriMatchType to ensure a proper migration (#1313) 2024-04-26 13:55:53 -05:00
David Perez
726cd5debd Update shortcut icons to be adaptive (#1312) 2024-04-26 12:17:28 -05:00
David Perez
977ce11f9d Add helper methods to disk source (#1311) 2024-04-26 11:46:37 -05:00
David Perez
9382c3a3a6 BIT-2296: Fix generator options disk source key (#1310) 2024-04-26 10:51:19 -05:00
David Perez
8aa7fd66bd Apply formatting and optimized imports to the app (#1309) 2024-04-26 08:57:42 -05:00
David Perez
174f7b8e52 BIT-2156: auto-prompt the user for biometrics (#1307) 2024-04-25 16:21:07 -05:00
David Perez
7d0064edbb BIT-2293, BIT-2294: Add vault and generator shortcuts (#1306) 2024-04-25 15:01:13 -05:00
David Perez
1a0cead2f1 BIT-2276: Add support for logging in with WebAuthN two-factor (#1304) 2024-04-25 12:35:58 -05:00
Ramsey Smith
fddcee455f BIT-2246: Update link for recovery code process (#1303) 2024-04-24 15:37:53 -06:00
David Perez
d4833f6639 Update the strings to the latest translations (#1302) 2024-04-24 11:14:56 -05:00
David Perez
534f052cca BIT-2291: Bypass master password reprompt when user has no password (#1301) 2024-04-24 10:17:29 -05:00
David Perez
abb22df994 BIT-2273: Maintain data when combining data state (#1298) 2024-04-23 15:42:17 -05:00
David Perez
0de2efefc8 BIT-2216: Add remove account option from account summary long-press (#1300) 2024-04-23 14:00:43 -05:00
David Perez
793cc41eb9 Update the BitwardenLogoutConfirmationDialog file to match the function name (#1299) 2024-04-23 11:23:39 -05:00
Ramsey Smith
6784d2bb3b BIT-2234: Delete Account Confirmation Screen (functionality) (#1290) 2024-04-23 09:43:06 -06:00
Ramsey Smith
9bd90b3d11 BIT-2217: Long email addresses account switcher ellipses (#1297) 2024-04-22 14:20:34 -06:00
David Perez
70f172759f Apply an immutable list to the Bitwarden segmented button (#1296) 2024-04-22 14:57:55 -05:00
Patrick Honkonen
35fb4758d4 BIT-1624 Fix OutOfMemoryException when uploading large files (#1293) 2024-04-22 15:28:14 -04:00
Caleb Derosier
b0b4e5eead BIT-2270: Use rememberVectorPainter method to fix icon recomposition (#1295) 2024-04-22 10:59:05 -06:00
David Perez
86b981b906 Add setup for WebAuthn (#1294) 2024-04-22 11:18:11 -05:00
David Perez
6825818f3a Force the UserState to re-evaluate on authentication change (#1291) 2024-04-22 09:32:30 -05:00
David Perez
7ac6d8e235 Rename FIDO_2_WEB_APP enum to WEB_AUTH (#1292) 2024-04-22 08:51:20 -05:00
Patrick Honkonen
f4485c437b BIT-2181: Move PreLogin and Register network calls to Identity API (#1285) 2024-04-19 17:42:42 -04:00
Caleb Derosier
24ad4f0f0a Replace all usage of semantics { testTag = '' } with extension (#1288) 2024-04-19 13:54:29 -06:00
David Perez
074bb560d5 BIT-2261: Check if user has master password to determine default timeout action (#1289) 2024-04-19 09:11:09 -05:00
David Perez
92bd8c6903 The stored 'shouldTrustDevice' boolean ise scoped to the userId (#1287) 2024-04-18 16:03:33 -05:00
David Perez
892b526ece BIT-2259: Check device trust after each vault unlock (#1286) 2024-04-18 14:52:23 -05:00
Caleb Derosier
bf8e875be7 BIT-2235: Add support for exporting vault data w/o passcode (#1281) 2024-04-18 13:03:57 -06:00
Ramsey Smith
167f465cbd BIT-2234: Delete Account Confirmation Screen (Navigation) (#1278) 2024-04-18 10:42:39 -06:00
David Perez
ce9bcac4b1 BIT-2256: Clear pending admin request when request is completed (#1284) 2024-04-17 16:58:57 -05:00
David Perez
359bec6eea BIT-2255: When admin-approval is denied, do not update the UI (#1283) 2024-04-17 16:25:00 -05:00
David Perez
eadc709dfa Update tests for clearData in AuthDiskSource and SettingsDiskSource (#1282) 2024-04-17 14:35:40 -05:00
David Perez
0ad81a2419 BIT-2247: Persists screen recording flag past a logout (#1280) 2024-04-17 11:39:30 -05:00
Brian Yencho
8c88cf2958 Add architecture documentation (#1274) 2024-04-17 09:20:15 -05:00
David Perez
216b5b1bc4 Add helper class for providing manager classes via CompositionLocalProvider (#1279) 2024-04-16 16:26:37 -05:00
David Perez
e4090b49da BIT-2208: Add test tags for dialogs (#1277) 2024-04-16 13:53:34 -05:00
Caleb Derosier
b1e1d8d00b Add requestOtp and verifyOtp API methods (#1275) 2024-04-16 11:40:38 -06:00
David Perez
a00b03ce03 BIT-2231: Disable components of the AccountSecurityScreen for TDE (#1276) 2024-04-16 12:07:46 -05:00
David Perez
6a54351389 Update set-password logic to accommodate TDE admin force password update (#1272) 2024-04-16 10:13:59 -05:00
Caleb Derosier
a3f4a2ed13 BIT-2183: Pass website with forwarded email username generation (#1249) 2024-04-15 14:31:19 -06:00
David Perez
f0d6ebb98f Update the Bitwarden SDK (#1271) 2024-04-15 14:02:38 -05:00
renovate[bot]
afb4d3ac9f [deps]: Update kotlin (#1268)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-15 10:50:15 -05:00
David Perez
7859a6e7b0 Remove the in-memory deviceKey (#1270) 2024-04-15 10:36:50 -05:00
renovate[bot]
fc9e117a38 [deps]: Update gradle minor (#1266)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-15 10:13:23 -05:00
Ramsey Smith
ae58303481 BIT-2233: Hide master password reprompt on add edit screen (#1265) 2024-04-15 09:00:49 -06:00
David Perez
d358f5f44a BIT-2240: Lock UserState while handling a successful login (#1264) 2024-04-15 09:42:58 -05:00
renovate[bot]
bad6c05621 [deps]: Update gradle/wrapper-validation-action action to v2.1.3 (#1267)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-15 09:24:18 -05:00
Ramsey Smith
f4aaa11f20 BIT-2221: Error message upon login (#1262) 2024-04-12 14:34:04 -06:00
David Perez
f0da48e886 Apply some minor clean up to the AuthRepo (#1263) 2024-04-12 13:59:23 -05:00
David Perez
032b0fc459 Remove an unused UI variable (#1261) 2024-04-12 12:27:40 -05:00
David Perez
cf7db6a3bf Persist the pending auth request even past a logout (#1260) 2024-04-12 12:13:22 -05:00
Caleb Derosier
ec2abb6d01 Update Bitwarden SDK to the latest (#1258) 2024-04-12 09:44:44 -06:00
David Perez
cd9cdcd070 BIT-2237: Sync password visibility fields for set and reset password screens (#1259) 2024-04-12 09:39:11 -05:00
David Perez
5c7f830593 Add login with password flow (#1254) 2024-04-11 16:46:40 -05:00
Caleb Derosier
7a6130fb8c BIT-2232: Don't require password for PIN setup for users w/o password (#1252) 2024-04-11 14:11:05 -06:00
David Perez
0af23a35b3 Remove needsPasswordReset from isVaultUnlocked logic (#1256) 2024-04-11 14:55:15 -05:00
David Perez
ef0c9bcf07 Update the version name to 2024.4.0 (#1257) 2024-04-11 14:18:05 -05:00
Ramsey Smith
6f026b70ca BIT-2202: Add element ids for cipher icons (#1251) 2024-04-11 09:06:47 -06:00
David Perez
a066619782 BIT-2236: Trusted Device screen logs out when unauthenticated (#1253) 2024-04-10 18:10:54 -05:00
David Perez
34e46835a9 Ensure trusted device is displayed before set password or reset password screens (#1250) 2024-04-10 12:58:06 -05:00
Ramsey Smith
d55306c78a BIT-2145: Create account dialog error (#1243) 2024-04-10 09:12:50 -06:00
David Perez
891a6daf0b Add the continue button flow for TDE (#1248) 2024-04-10 10:12:11 -05:00
Caleb Derosier
573bdf289b Clean up generator minimum length implementation (#1244) 2024-04-09 14:51:05 -06:00
David Perez
6d5c8273ed Establish device trust directly with a TrustDeviceResponse (#1246) 2024-04-09 11:06:31 -05:00
David Perez
9e75135c6f Make the passwordHash nullable on the organizationResetPasswordEnroll API (#1247) 2024-04-09 10:12:57 -05:00
David Perez
6c4c9423d7 Add makeRegisterTdeKeysAndUnlockVault to authSdkSource (#1245) 2024-04-09 09:19:51 -05:00
David Perez
bd09d6bd46 Make SdkClientManager the single source of the Bitwarden SDK Client (#1242) 2024-04-08 16:47:25 -05:00
Caleb Derosier
d681a129de BIT-2106: Export vault file with password (#1241) 2024-04-08 15:06:25 -06:00
Caleb Derosier
5dce40f14a BIT-2136: Update minimum length handling in Generator (#1238) 2024-04-08 14:16:28 -06:00
Ramsey Smith
382bac7aaa BIT-2119: View item screen element ids (#1237) 2024-04-08 13:55:47 -06:00
David Perez
2525b65070 Add createAccountKeys API (#1240) 2024-04-08 14:39:22 -05:00
David Perez
5d88985e9f Add dialog support for TrustedDeviceScreen (#1239) 2024-04-08 13:03:58 -05:00
David Perez
bdce5b4c31 Add initial UI flow for TDE (#1235) 2024-04-08 10:04:31 -05:00
David Perez
52756abe13 Remove unused intent manager (#1236) 2024-04-05 16:42:52 -05:00
David Perez
236a979522 Update login logic to handle TDE authentication (#1234) 2024-04-05 15:33:30 -05:00
Brian Yencho
79db19c8fd Fix section link in Code Style documentation (#1233) 2024-04-05 13:07:14 -05:00
Brian Yencho
7902bf406b Remove unnecessary extra testing keystore (#1232) 2024-04-05 09:56:40 -05:00
David Perez
8bc58c2fcf BIT-2201: Handle URI checksum validation (#1231) 2024-04-04 21:19:51 -06:00
Ramsey Smith
47e94a3896 BIT-1469: Autofill talkback (#1226) 2024-04-04 20:36:59 -05:00
Caleb Derosier
b1f1972e3f BIT-2207: Remove Rate the App row (#1228)
Co-authored-by: David Perez <david@livefront.com>
2024-04-04 17:07:49 -05:00
David Perez
4e4add9a41 Organize LoginCommon and helper methods (#1229) 2024-04-04 16:48:13 -05:00
Caleb Derosier
464490e68f BIT-2207: Move Give Feedback form to About screen (#1227) 2024-04-04 11:25:21 -06:00
Caleb Derosier
0abb41d22c Update Github PR template to remove useless categories (#1225) 2024-04-04 10:39:51 -06:00
David Perez
fc10a77b69 Add trusted device logic (#1224) 2024-04-04 11:13:18 -05:00
David Perez
eb4104a39c Update AuthRequestManager for TDE (#1223) 2024-04-04 09:54:05 -05:00
Caleb Derosier
4d114f4bbd BIT-2104: Add check for file passwords matching (#1222) 2024-04-03 16:29:40 -06:00
Patrick Honkonen
3ec5f054dd Display SDK error message when generating email alias (#1219) 2024-04-03 17:29:21 -04:00
David Perez
c8727f21fd Expose the 'shouldTrustDevice' boolean from auth repo (#1220) 2024-04-03 15:47:33 -05:00
David Perez
92fcf9dec8 Fix minor dialog bug where top is not padded if title is missing (#1221) 2024-04-03 15:46:39 -05:00
Caleb Derosier
c6f0af52bd Fix incorrect VM state access & unnecessary eventFlow usages (#1218) 2024-04-03 13:36:57 -06:00
David Perez
58c195a4df default timeout action should be LOGOUT when using TDE (#1216) 2024-04-03 11:56:33 -05:00
David Perez
8f0b42a441 Remove redundant call to set vault to unlocked (#1217) 2024-04-03 11:49:41 -05:00
Patrick Honkonen
a56300fe09 Update Renovate config (#1215) 2024-04-03 10:09:05 -04:00
Caleb Derosier
2df9aa1a03 Remove inline keyword from updatePasswordLength() (#1213) 2024-04-02 16:36:44 -06:00
David Perez
6dc4cddfd6 Update KSP (#1212) 2024-04-02 17:22:10 -05:00
David Perez
5b55ab6070 Upon trusting device, update decryption options (#1211) 2024-04-02 17:21:50 -05:00
David Perez
45d0ac98b8 Apply result extension consistently (#1210) 2024-04-02 13:55:38 -05:00
David Perez
155135429d Allow device key to be persisted to memory (#1209) 2024-04-02 13:23:01 -05:00
David Perez
9c8a47a751 Minor formatting and cleanup (#1208) 2024-04-02 10:54:47 -05:00
David Perez
905cc3807d Persist device key past a logout (#1207) 2024-04-02 09:36:32 -05:00
Caleb Derosier
ec9339a24a BIT-2102: Require all password fields for vault export (#1206) 2024-04-02 08:35:39 -06:00
Caleb Derosier
888740693a BIT-2103: Sync show/hide file password fields on Vault Export screen (#1205) 2024-04-01 16:02:45 -06:00
Caleb Derosier
db00a0e26c BIT-2136: Fix generator error when length can't accommodate settings (#1181) 2024-04-01 15:21:48 -06:00
Ramsey Smith
35ea6b446e BIT-2120: Add ElementID's to Add/Edit views (Login) (#1202) 2024-04-01 15:13:25 -06:00
Ramsey Smith
9afc94c3f0 BIT-2122: Add ElementID's to Add/Edit views (Card) (#1203) 2024-04-01 13:43:28 -06:00
Ramsey Smith
b5547a3782 BIT-2124: Add ElementID's to Add/Edit views (Identity) (#1201) 2024-04-01 13:43:15 -06:00
Ramsey Smith
5c05002aaf BIT-2126: Add ElementID's to Add/Edit views (Secure Note) (#1200) 2024-04-01 13:43:01 -06:00
David Perez
19abd714be Add stored pending auth request (#1204) 2024-04-01 14:19:11 -05:00
David Perez
a067fbd3cb Update to the latest Bitwarden SDK (#1198) 2024-04-01 12:35:03 -05:00
Caleb Derosier
4aa06262d8 BIT-2175: Update copy on give feedback modal (#1199) 2024-04-01 10:54:42 -06:00
Ramsey Smith
a6adfbbc02 BIT-2150: Incorrect default timeout (#1197) 2024-04-01 10:41:29 -06:00
Caleb Derosier
7e1c4f946e BIT-2109: Add file password strength indicator to vault export (#1196) 2024-04-01 10:01:47 -06:00
David Perez
b7fb0e4c4f Update LoginWithDeviceScreen to support Admin Approval type (#1175) 2024-04-01 10:34:05 -05:00
Patrick Honkonen
f133e58b84 BIT-2129 Show descriptive error message when Send creation fails (#1186) 2024-04-01 10:54:24 -04:00
Caleb Derosier
3bc79e759e BIT-2101 BIT-2103: Update export flow for JSON (password protected) (#1188) 2024-03-29 13:51:17 -06:00
David Perez
6f106242c5 Update to v2.11.0 of retrofit with BOM (#1194) 2024-03-29 14:40:03 -05:00
David Perez
3ab3d7c2a6 Update Kotlin Serialization to 1.6.3 (#1193) 2024-03-29 13:49:04 -05:00
David Perez
6c2fc07989 Update compose compiler to 1.5.11 (#1192) 2024-03-29 13:47:51 -05:00
David Perez
429b4d3400 Update AGP to 8.3.1 (#1190) 2024-03-29 13:02:59 -05:00
David Perez
35289d3095 Update compose BOM to 2024.03.00 (#1189) 2024-03-29 13:02:45 -05:00
David Perez
d3dba6640f Update the Firebase BOM to 32.8.0 (#1191) 2024-03-29 13:02:27 -05:00
David Perez
6a09ba0d2c BIT-2169: Add @Keep to retrofit interface to avoid proguard crash in release (#1187) 2024-03-29 11:04:05 -05:00
Caleb Derosier
ffa268e0f8 BIT-2159: Update .json (Encrypted) text to .json (Password Protected) (#1182) 2024-03-28 16:34:47 -06:00
David Perez
cd35e37f4a Create trusted device service (#1185) 2024-03-28 16:43:35 -05:00
Patrick Honkonen
4d403e6d99 Display environment label in account switcher (#1179) 2024-03-28 16:44:08 -04:00
Ramsey Smith
1d95c1066c BIT-1989-settings-about-dialog-landscape-error (#1180) 2024-03-28 14:07:20 -06:00
David Perez
69e2bb15f3 Move the sdk trustDevice API to the VaultSdkSource (#1184) 2024-03-28 14:26:41 -05:00
David Perez
1ebaa4d2e6 Add trusted device API (#1183) 2024-03-28 13:07:02 -05:00
Patrick Honkonen
3fd15ef6b8 Clear MP field when switching account on unlock screen (#1178) 2024-03-27 18:00:37 -04:00
Caleb Derosier
06228310bf Change give feedback copy to title case (#1177) 2024-03-27 14:12:10 -06:00
Ramsey Smith
6abdb6e6f9 BIT-2160: Edit cipher crash (#1176) 2024-03-26 18:26:39 -05:00
Ramsey Smith
0136f62913 BIT-2128: Item creation screen cipher type error (#1169) 2024-03-26 11:32:03 -06:00
Caleb Derosier
d3ff479719 BIT-2131: Display folders when filtering by org in vault (#1170) 2024-03-26 11:21:39 -06:00
David Perez
a2f3c2f171 Add 'Device-Identifier' header for auth-requests API (#1174) 2024-03-26 11:23:51 -05:00
renovate[bot]
f9439b85ce Update gh minor (#1172)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 11:00:08 -05:00
David Perez
4f0ff883cd Add new AuthRequestTypeJson types (#1173) 2024-03-26 10:16:29 -05:00
David Perez
044f47b667 Simplify private method by returning Result (#1171) 2024-03-24 16:11:49 -05:00
David Perez
69a8ed9bdb Update to the most recent string translations (#1168) 2024-03-21 17:18:27 -05:00
Caleb Derosier
456e83763a BIT-2114 & BIT-2137: Add Give Feedback link to Other screen (#1166) 2024-03-21 15:46:04 -06:00
David Perez
d0641725e5 Set the TDE reason for a forced password reset (#1167) 2024-03-21 15:49:27 -05:00
Caleb Derosier
208130f121 BIT-2015 BIT-2016: Fix min number and min special chars not propagating (#1163) 2024-03-20 15:51:51 -06:00
David Perez
3eae49e07a BIT-2117: Add activate-autofill policy type (#1164) 2024-03-20 14:08:09 -05:00
David Perez
446f049877 Back button on TrustedDeviceScreen should logout (#1162) 2024-03-20 10:26:03 -05:00
Patrick Honkonen
344ccaafda BIT-2046 Fix passkey creation date display (#1161) 2024-03-19 18:27:55 -04:00
David Perez
99293a12d5 Log user out when clicking 'not you' on trusted device screen (#1160) 2024-03-19 16:38:10 -05:00
Ramsey Smith
047a2ae22e BIT-1954: Autofill Items with TOTP Codes Do Not Autofill on Pre Android 11 (#1158) 2024-03-19 12:02:24 -05:00
Caleb Derosier
072ed1f8ba BIT-2018: Support org reset password enrollment in JIT provisioning (#1159) 2024-03-19 10:56:44 -06:00
Patrick Honkonen
906c8222d2 BIT-2046 Display passkey fields in Vault (#1143) 2024-03-19 11:35:35 -05:00
Ramsey Smith
9241cd640b BIT-1955: Autofill Brings User to the Incorrect Page on Pre Android 11 (#1157) 2024-03-19 09:17:34 -07:00
David Perez
939816f76f BIT-1405: Update date-time picker labels (#1156) 2024-03-19 10:24:47 -05:00
Caleb Derosier
46d3eb4705 BIT-2036: Update pre-validation endpoint URL (#1155) 2024-03-18 20:34:44 +00:00
Ramsey Smith
ad42b969f5 BIT-2070: Enable individual Cipher Encryption for SDK (#1148) 2024-03-18 11:41:51 -07:00
David Perez
93c53d5dd5 Update gemfile to address security alert for nokogiri (#1154) 2024-03-18 12:55:20 -05:00
David Perez
6803466f09 BIT-2084: Add test tag to organization dropdown (#1153) 2024-03-18 12:54:57 -05:00
David Perez
17c38acb52 Add UI support for hiding all button on TrustedDeviceScreen (#1152) 2024-03-18 12:54:26 -05:00
renovate[bot]
882a7de526 Update actions/setup-java action to v4.2.1 (#1151)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-18 09:04:00 -05:00
Patrick Honkonen
5aae7acc80 BIT-2040 Correct redirect behavior for Import Items action (#1150) 2024-03-15 16:46:44 -04:00
Patrick Honkonen
3bad702d25 BIT-2046 Define FIDO2 credential network models (#1137) 2024-03-15 18:39:41 +00:00
Patrick Honkonen
596d5ec566 Enable build cache (#1149) 2024-03-15 14:37:34 -04:00
David Perez
3508d87c99 Add getTrustDevice API to AuthSdkSource (#1147) 2024-03-14 17:26:23 -05:00
David Perez
334557add6 Add email navigation param and environment repo to the TrustedDeviceViewModel (#1146) 2024-03-14 15:44:33 -05:00
David Perez
04a8049b41 BIT-2078: Add element IDs for search screen (#1145) 2024-03-14 14:52:53 -05:00
David Perez
5412250e90 BIT-2080: Sync time updated when sync is not needed (#1144) 2024-03-14 11:17:50 -05:00
David Perez
a18ab4a150 Fill out trusted device UI (#1142) 2024-03-14 11:15:43 -05:00
Ramsey Smith
51a28014ef BIT-2069: Upgrade app version name (#1141) 2024-03-13 15:41:45 -06:00
Ramsey Smith
64c9b0ad39 BIT-2021: Add key for individual cipher encryption (#1138) 2024-03-13 15:24:21 -06:00
David Perez
3f6fb24ebd Add optional description for the BitwardenSwitch (#1140) 2024-03-13 14:34:19 -05:00
David Perez
00d7cce67f Add missing test for Trusted Device Screen (#1139) 2024-03-13 14:29:14 -05:00
Caleb Derosier
36cc20c67b BIT-1921: Add JIT Provisioning (#1133) 2024-03-13 12:14:28 -06:00
David Perez
8a7331c52b Add skeleton for trusted device UI (#1132) 2024-03-13 11:35:53 -05:00
David Perez
842ccbf245 BIT-1941: Add test tag for user and environment (#1136) 2024-03-13 11:25:46 -05:00
David Perez
986969c371 BIT-1591: Add test tag for generator policy (#1135) 2024-03-13 11:20:00 -05:00
David Perez
68778eecbd BIT-1530: Dropdowns should use testtags as resource ids (#1134) 2024-03-13 11:19:38 -05:00
David Perez
2f4902a1f0 Update strings in app (#1131) 2024-03-13 09:19:11 -05:00
David Perez
772f0a9f6f BIT-1992: Add test tags to the folders UI (#1130) 2024-03-12 17:01:32 -05:00
David Perez
00d61323b9 BIT-1990: Add test tags for all rows in setting UI (#1129) 2024-03-12 16:49:37 -05:00
David Perez
60009224e5 BIT-2023 Add test tag for pending request items (#1127) 2024-03-12 15:54:13 -05:00
David Perez
7e344fb700 BIT-1971: Add remaining appbar and fab test tags (#1128) 2024-03-12 15:53:54 -05:00
Ramsey Smith
c338a5b2df BIT-2022: Autofill crash (#1126) 2024-03-12 11:18:16 -06:00
David Perez
a10e75401d BIT-1973: Add test tags for account switcher (#1124) 2024-03-12 08:52:10 -05:00
David Perez
9faf4bd731 BIT-1971: Add test tags to all app bar elements (#1125) 2024-03-12 08:51:54 -05:00
David Perez
158549af8e BIT-1969: Add testTags for password history (#1123) 2024-03-11 16:58:52 -05:00
David Perez
858697e587 Actions block allows testTag (#1122) 2024-03-11 16:58:17 -05:00
David Perez
bbcf5047ef Add set-password function to auth repo (#1121) 2024-03-11 14:35:06 -05:00
David Perez
655609306d Fix composable typo (#1120) 2024-03-11 11:16:57 -05:00
David Perez
0caa27142b Replace remaining usages of TimeZone with Clock (#1119) 2024-03-11 10:35:59 -05:00
David Perez
331060b336 Update compose BOM and compose navigation (#1118) 2024-03-08 15:43:20 -06:00
Oleg Semenenko
203608813a Replace actionChannel.trySend in the tests (#1117) 2024-03-08 15:42:44 -06:00
David Perez
2fd3ed5c64 Clean up broken documentation links (#1116) 2024-03-08 15:07:32 -06:00
David Perez
78a84f86bd Update enum values() to entries (#1115) 2024-03-08 15:07:12 -06:00
Oleg Semenenko
12d09823dc BIT-2009 Add support for nested collections (#1111) 2024-03-08 14:24:32 -06:00
David Perez
4d7e81fbf0 Update the Bitwarden SDK to 2024-03-06 (#1114) 2024-03-08 14:17:15 -06:00
David Perez
c5083f6c9e Clean up usages for the DateTimeFormatter (#1113) 2024-03-08 13:35:45 -06:00
David Perez
d7c20d56a2 Inject clock into ViewModels (#1112) 2024-03-08 10:14:04 -06:00
David Perez
637900641a Add the setPassword API (#1110) 2024-03-07 14:58:09 -06:00
David Perez
b7663153ff Simplify login dialogs under single state property (#1109) 2024-03-07 11:40:36 -06:00
David Perez
a7ee9ebdd1 Add needsMasterPassword field to userState (#1105) 2024-03-07 09:37:18 -06:00
David Perez
c8031ea309 Update Androidx Camera and Browser dependencies (#1107) 2024-03-07 09:11:52 -06:00
David Perez
db1053ffef Update Mockk to 1.13.10 (#1106) 2024-03-07 09:11:33 -06:00
David Perez
bb4f5ab3de Update Junit to 5.10.2 (#1104) 2024-03-06 17:49:28 -06:00
David Perez
f8eaf7b84a Update Firebase BOM to 32.7.3 (#1103) 2024-03-06 17:09:28 -06:00
David Perez
99a7dedd4e Update AGP to 8.3.0 and gradle to 8.6 (#1102) 2024-03-06 16:24:23 -06:00
David Perez
15a2207196 Catch exception caused by trying to process large files on devices with low memory (#1101) 2024-03-06 14:13:05 -06:00
renovate[bot]
bafdd1a710 Update gh minor (#1063)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-06 13:50:55 -06:00
David Perez
f84b33cf1b BIT-752: Update the dropdown accessibility callout (#1100) 2024-03-06 13:15:27 -06:00
Ramsey Smith
a2e31c2b04 BIT-1965: Send email 2FA verification when switching to screen. (#1096) 2024-03-06 11:54:04 -07:00
David Perez
416ba9bb9a Finish UI components package organization (#1099) 2024-03-06 11:01:19 -06:00
David Perez
fc98cbcf20 Create field package for ui components (#1098) 2024-03-06 09:20:52 -06:00
Patrick Honkonen
25a695c5df Document Compose to Kotlin version compatibility map (#1097) 2024-03-05 22:01:19 -05:00
Patrick Honkonen
24af4d7b1f PM-6578: Ignore "android" idPackage in autofill traversal data (#1083) 2024-03-05 16:17:08 -05:00
David Perez
2081941bda Hide vault listing divider when only one category exists (#1095) 2024-03-05 12:00:54 -06:00
David Perez
e0de4d5eb5 Create header package (#1094) 2024-03-05 11:41:31 -06:00
Oleg Semenenko
3aa6492a83 BIT-1115 Add nested folder support (#1072) 2024-03-05 11:00:45 -06:00
David Perez
4efc928826 Add content package (#1093) 2024-03-05 09:38:46 -06:00
David Perez
41b53b7129 Create appbar package (#1091) 2024-03-04 17:08:12 -06:00
David Perez
453cd16c02 Add default modifier to all composables (#1092) 2024-03-04 16:38:57 -06:00
David Perez
16207fe62c Move dialog components to dialog package (#1090) 2024-03-04 15:40:02 -06:00
Patrick Honkonen
3113f9eddc BIT-1962: Add Direct Link to Privacy Policy in About Screen (#1084) 2024-03-04 16:36:06 -05:00
David Perez
e1806007cd Add notification-specific icons (#1088) 2024-03-04 14:26:12 -06:00
David Perez
4280787f5c Create button package (#1087) 2024-03-04 14:09:35 -06:00
Patrick Honkonen
deabcc8301 BIT-1957: Update Email Alias generator UI to include 'ForwardEmail' (#1082) 2024-03-04 14:32:05 -05:00
David Perez
66b17c9c2b Moves switches to switch package (#1086) 2024-03-04 13:08:11 -06:00
David Perez
ae0d774230 Clean up imports (#1085) 2024-03-04 13:03:45 -06:00
David Perez
0bcd5c761a BIT-1599: Add test tags as resources for selection dialogs (#1081) 2024-03-04 11:03:26 -06:00
David Perez
a30de9f787 BIT-1602: Fix duplicated element ID (#1080) 2024-02-28 10:50:17 -06:00
David Perez
e2e35f3530 Update the Bitwarden SDK (#1079) 2024-02-28 09:35:07 -06:00
David Perez
2d16154e83 BIT-1597: Add element IDs to Edit Send Screen (#1078) 2024-02-27 15:44:15 -06:00
David Perez
43ca009f53 BIT-1602: Add element IDs to AccountSecurityScreen (#1077) 2024-02-27 15:43:57 -06:00
David Perez
bb496fdbb3 BIT-1603: Add element IDs to the AboutScreen (#1076) 2024-02-27 15:04:24 -06:00
David Perez
c962f4c0fc BIT-1606: Add element IDs to DeleteAccountScreen (#1075) 2024-02-27 15:04:09 -06:00
David Perez
4fb4b00d91 BIT-1599: Add element IDs to SendScreen (#1074) 2024-02-27 14:40:24 -06:00
David Perez
a0c369ca22 BIT-1614: Add element IDs to SettingsVaultScreen (#1073) 2024-02-27 14:18:29 -06:00
David Perez
8198224eea BIT-1607: Add element IDs to Settings Appearance Screen (#1071) 2024-02-27 12:57:07 -06:00
Ramsey Smith
d113fc27f6 BIT-1897-vault-appearing-when-policy-set (#1064) 2024-02-27 10:44:21 -07:00
David Perez
1a262a9714 BIT-1610: Add element IDs to Settings AutoFillScreen (#1070) 2024-02-27 11:35:54 -06:00
David Perez
ac3dc572ba BIT-1611: Add element IDs to Settings OtherScreen (#1069) 2024-02-27 08:53:09 -06:00
David Perez
6ce1ee9e18 Add tests tags and limit line size for navbar items (#1068) 2024-02-26 16:55:20 -06:00
David Perez
03797d15ae BIT-1907: Add element IDs to Generator Password Screen for Appium tests (#1067) 2024-02-26 16:45:38 -06:00
David Perez
a588823b06 BIT-1652: Add element IDs to AddItem Screen for Appium tests (#1066) 2024-02-26 14:43:52 -06:00
David Perez
31762bd3d1 BIT-1650: Add element IDs to Vault Screen for appium tests (#1065) 2024-02-26 14:20:24 -06:00
David Perez
f3489ae300 Ensure all data from network logger makes it into the logs (#1062) 2024-02-26 09:27:43 -06:00
David Perez
6f949d9c35 Update the way we handle push notifications (#1061) 2024-02-23 17:12:02 -06:00
David Perez
bca9d1ca67 Clean up unused launcher resources (#1060) 2024-02-23 16:01:44 -06:00
David Perez
bf7037c231 BIT-1939: Add collection IDs back to network response (#1059) 2024-02-23 11:12:20 -06:00
Oleg Semenenko
837ae67087 BIT-1571 Update custom field to follow the design. (#1055) 2024-02-23 10:09:34 -06:00
David Perez
a3d67ad419 BIT-1938: Display toast after updating cipher collection or moving cipher to an organization (#1058) 2024-02-22 18:12:05 -06:00
David Perez
a25b6b77bc BIT-729: Update master password hint text (#1057) 2024-02-22 17:39:05 -06:00
David Perez
9eba15fddf BIT-1898: Two-factor auth should have access to device data if available (#1054) 2024-02-22 14:05:13 -06:00
Oleg Semenenko
39faa09556 BIT-1908 Add element IDs for vault export screen (#1053) 2024-02-22 13:26:12 -06:00
Oleg Semenenko
6df141840d BIT-1422 Add padding for the navigation bar for QR code scan screen (#1051) 2024-02-22 12:51:13 -06:00
David Perez
951d64a652 BIT-1943: ResetPasswordScreen was missing navigation bar padding (#1052) 2024-02-22 12:41:34 -06:00
David Perez
9157bcaa0a Update dispatcherManager naming for consistency (#1050) 2024-02-22 10:25:04 -06:00
Oleg Semenenko
a72ab4f5cc BIT-1935 Filter out trash items for export (#1048) 2024-02-22 10:14:33 -06:00
David Perez
b685515f5f Clean up minor warnings and formatting in tests (#1049) 2024-02-22 10:09:24 -06:00
David Perez
d7e2dc9ed2 BIT-1927: Add updated translations and update Duo strings (#1046) 2024-02-22 09:11:10 -06:00
David Perez
3124ccff9b BIT-1923: Add the Yubi Key image to the two-factor login screen (#1047) 2024-02-22 08:44:31 -06:00
Oleg Semenenko
767f998672 BIT-1274, BIT-1275, BIT-1276 Add the ability to export user vault data (#1040) 2024-02-21 13:06:20 -06:00
Ramsey Smith
f386d2ab14 BIT-1623: Loading State Not Shown on Initial Vault Access (#1045) 2024-02-21 12:32:03 -06:00
David Perez
41c9839d7d BIT-1915: Migrate account tokens to encrypted shared preferences (#1039) 2024-02-21 12:26:47 -06:00
Caleb Derosier
c7b107166a Handle null or blank auth urls for Duo 2FA (#1044) 2024-02-21 11:00:38 -07:00
David Perez
2a9e6400ac Decode vault database json on default dispatcher (#1043) 2024-02-21 11:32:11 -06:00
Oleg Semenenko
0b40728c7d Update the Bitwarden SDK to 0.4.0-20240220.184426-138 (#1042) 2024-02-21 11:05:13 -06:00
David Perez
f9273c587e Update to ksp 1.9.22-1.0.17 (#1041) 2024-02-21 10:56:15 -06:00
Caleb Derosier
14cc6991db BIT-1917: Add Duo 2-factor authentication (#1036) 2024-02-20 16:55:23 -06:00
David Perez
83b6d424f3 Add spot in encrypted shared preferences for tokens (#1038) 2024-02-20 14:03:36 -06:00
Ramsey Smith
aeafdd9fcd BIT-1349: Generator screen text overlap bug (#1037) 2024-02-20 09:12:09 -07:00
Ramsey Smith
388bb50e56 BIT-1912: Store collection ids after creation or share. (#1033) 2024-02-19 12:05:57 -07:00
Oleg Semenenko
d9f8e43c83 BIT-1888 Add the check for the last revision date (#1029) 2024-02-19 08:34:13 -06:00
David Perez
b22a5d9219 Create AccountTokensJson for reusability (#1035) 2024-02-16 16:59:28 -06:00
David Perez
4a0748a809 Update Kotlin and compiler (#1034) 2024-02-16 16:38:13 -06:00
David Perez
4ad425b364 Use the clock in the Generator Repo (#1032) 2024-02-16 16:12:38 -06:00
David Perez
7a937df8e5 Minor cleanup of Generator Repo tests (#1031) 2024-02-16 15:25:42 -06:00
David Perez
c62b3aa80f Minor cleanup of Vault Repo tests (#1030) 2024-02-16 14:47:01 -06:00
David Perez
e3ff081a36 Minor cleanup of AuthRepo tests (#1028) 2024-02-16 12:40:39 -06:00
Ramsey Smith
3b392f927a BIT-1555: identity name bug (#1026) 2024-02-16 10:40:43 -07:00
David Perez
54ec71f328 BIT-1901, BIT-1904 Add Yubi key support (#1025) 2024-02-16 11:37:20 -06:00
David Perez
dcf7669d02 Move auth request logic into its own manager class (#1027) 2024-02-16 11:29:02 -06:00
Ramsey Smith
e0e0e2a864 BIT-1724: No folder vault section (#1021) 2024-02-15 16:03:24 -07:00
David Perez
30dbf47d9c Rename WebAuthCallbackActivity to be more generic (#1024) 2024-02-15 16:11:57 -06:00
David Perez
5360c5fb87 Minor cleanup of the MainViewModelTests and the AuthRepo (#1023) 2024-02-15 15:33:19 -06:00
David Perez
98ec9edbbb Process NFC data from a Yubi Key (#1020) 2024-02-15 14:54:46 -06:00
David Perez
8d94b3b7fd Minor clean up of the TwoFactorLoginScreen (#1022) 2024-02-15 13:56:07 -06:00
Caleb Derosier
a043e1787c Remove unnecessary constructor keyword from Impl classes (#1019) 2024-02-15 10:12:26 -07:00
Oleg Semenenko
3d831ab75f BIT-1719 Log a user out on a notificaiton (#1013) 2024-02-15 10:39:06 -06:00
David Perez
543ee256c9 Update the TwoFactorRequired response to be able to parse multiple payload types (#1018) 2024-02-15 10:28:34 -06:00
David Perez
8f1ee2d9bb Add support for listening to NFC broadcasts (#1017) 2024-02-15 09:15:47 -06:00
David Perez
5dff84e0ef Add NFC support to the manifest (#1014) 2024-02-14 10:39:28 -06:00
David Perez
ebb54692c3 BIT-1662: Fix pull to refresh on content that did not scroll (#1012) 2024-02-13 17:48:46 -06:00
David Perez
4baf4486dc BIT-1558: Search toolbar IME action should close the keyboard (#1011) 2024-02-13 17:46:23 -06:00
Oleg Semenenko
cbc15ca260 Logout a user on sync if the security stamp does not match (#1002) 2024-02-13 17:36:37 -06:00
Oleg Semenenko
c1f7e4de20 BIT-1584 Fix the view password overflow item visibility (#1008) 2024-02-13 16:36:08 -06:00
Brian Yencho
7b98672324 BIT-1899: Post root navigation calls to avoid visual defects on startup (#1009) 2024-02-13 16:04:05 -06:00
David Perez
c52c7b4ff4 VaultRepo clears in-memory vault data whenever the active account changes (#1010) 2024-02-13 15:42:58 -06:00
David Perez
c1328258b9 BIT-1729: Re-load the options to apply policy values (#1000) 2024-02-13 12:53:12 -06:00
David Perez
4da3c4fcde Add AuthDiskSource helper for knowing when the user changes (#1007) 2024-02-13 12:18:23 -06:00
Ramsey Smith
63ec515661 BIT-1703: Card brand UI error (#997) 2024-02-13 11:04:40 -07:00
Oleg Semenenko
9a1b1be8cd BIT-1583 Save the items as null if they are blank (#1006) 2024-02-13 11:17:54 -06:00
Brian Yencho
4a529e990f Remove now-unnecessary unlocking check when calling sync (#1004) 2024-02-13 10:23:25 -06:00
David Perez
1bb9e5f6b4 Add rtl mirroring for more images (#1005) 2024-02-13 10:19:59 -06:00
Oleg Semenenko
2cdc70eded BIT-1171 Update the login with device IDs (#1003) 2024-02-13 09:05:05 -06:00
Brian Yencho
27ba67e2ba Replace one-off exclusion rules with @OmitFromCoverage (#1001) 2024-02-12 16:42:51 -06:00
David Perez
57c17eae04 Directional icons should be mirrored in right to left languages (#999) 2024-02-12 15:50:46 -06:00
David Perez
eea7c1aa8d Allow for more language support at an OS level (#998) 2024-02-12 14:06:21 -06:00
David Perez
7a66528523 Add missing enum valur to ForcePasswordResetReason (#996) 2024-02-12 10:34:21 -06:00
renovate[bot]
f7a9743032 Update gradle/wrapper-validation-action action to v2.1.1 (#995)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-12 09:49:12 -06:00
David Perez
9e2fe40f5a Update to Java 17 (#994) 2024-02-09 13:22:22 -06:00
David Perez
6f69383780 Update androidx navigation and lifecycle libraries (#993) 2024-02-09 11:54:31 -06:00
David Perez
b2a1fdcd66 Update Firebase BOM and Google Services (#992) 2024-02-09 10:25:09 -06:00
David Perez
31c6793237 Fix resend button moving around (#991) 2024-02-09 10:21:37 -06:00
David Perez
9f81eee3ca BIT-1729: Update generator policy UI in realtime (#990) 2024-02-08 17:10:25 -06:00
David Perez
42fb9a8e1e Add helper handle methods for MainType and Internal actions (#989) 2024-02-08 15:02:37 -06:00
Oleg Semenenko
717c0ac13a BIT-1658 Change the Linked custom field to display the name (#988) 2024-02-08 12:35:47 -06:00
David Perez
6c928ce49b BIT-724: Update touch targets (#986) 2024-02-08 12:26:27 -06:00
Oleg Semenenko
82cc31e023 BIT-1679 Add the CipherAttachment test tag (#987) 2024-02-08 11:33:10 -06:00
David Perez
01b6e18a2d BIT-1671: Fix transition jank (#984) 2024-02-08 10:50:37 -06:00
Oleg Semenenko
20f7618c13 BIT-1714 Add the ID to the decline all requests button (#983) 2024-02-08 10:22:47 -06:00
David Perez
3d80a3b5bb Remove wrapper column on LoginScreen (#985) 2024-02-08 09:05:13 -06:00
David Perez
3f8b33b422 Hide soft keyboard when attempting to login (#982) 2024-02-07 18:48:17 -06:00
Ramsey Smith
fdb1f46c7f BIT-1704: Edit items in collection bug (#977) 2024-02-07 15:52:39 -07:00
David Perez
3631e5028b BIT-702: Update Compose BOM and remove explicit Material 3 library version (#981) 2024-02-07 16:29:22 -06:00
Oleg Semenenko
2eaeeb4d4e BIT-1577 Add the options element ID (#980) 2024-02-07 16:17:13 -06:00
Oleg Semenenko
1a0b08cce1 BIT-1709 Add the button element Ids on the AddSend screen (#975) 2024-02-07 16:16:49 -06:00
Oleg Semenenko
411207a8de BIT-1679 Update test tags for VaultItemScreen (#973) 2024-02-07 16:16:20 -06:00
David Perez
301742a31b Fix minor optimization issues (#979) 2024-02-07 15:13:27 -06:00
Oleg Semenenko
a484eddd56 BIT-1592 Update element ID location for search items (#970) 2024-02-07 14:49:42 -06:00
David Perez
ce327c6d5c BIT-1524, BIT-898: Update generated text (#964) 2024-02-07 14:31:52 -06:00
Oleg Semenenko
24eca3fe04 Move the testTagAsResourceId modifier (#978) 2024-02-07 13:56:07 -06:00
David Perez
1bf90f7e81 Check database schemas to source control (#976) 2024-02-07 11:38:13 -06:00
Oleg Semenenko
6ec89e31d6 BIT-1708 Add the test tag for the policy notice. (#974) 2024-02-07 10:04:05 -06:00
Ramsey Smith
6e56626f5c BIT-1664: Vault add item ownership tests. (#969) 2024-02-07 08:21:37 -07:00
Oleg Semenenko
8d5f5084be BIT-1677 Update the tags on the AddEdit Item screen. (#972) 2024-02-07 09:06:29 -06:00
Oleg Semenenko
a65c73c203 BIT-1676 Update the attachment screen test ID. (#971) 2024-02-07 09:05:44 -06:00
Oleg Semenenko
77d944faad BIT-1701 Add the policy notice to the add send screen. (#963) 2024-02-06 12:57:26 -06:00
Brian Yencho
ccec9724fb BIT-1715: Fix autofill account-switching data loading error (#965) 2024-02-06 12:56:58 -06:00
David Perez
88620dc42b Apply minor compose optimizations (#967) 2024-02-06 12:55:13 -06:00
David Perez
81c0724359 Fix incorrect test imports (#966) 2024-02-06 12:54:49 -06:00
David Perez
9a1726aa18 Remove unused accompanist dependency (#962) 2024-02-06 12:52:26 -06:00
David Perez
0aa5977d49 Remove deprecations (#961) 2024-02-06 12:52:08 -06:00
David Perez
58da635c25 Update mockk and kover (#960) 2024-02-06 12:51:07 -06:00
David Perez
d16130a4fe BIT-1663: Display toast when auth request is declined or approved (#968) 2024-02-06 12:50:35 -06:00
David Perez
8e87dc0de2 Update to the latest version of AGP (v8.2.2) (#958) 2024-02-05 16:59:23 -06:00
David Perez
5739b7db1e Remove the usage of the deprecated AlertDialog (#959) 2024-02-05 16:56:21 -06:00
David Perez
dfcd3f1843 Update compose BOM and material 3 library (#957) 2024-02-05 16:21:50 -06:00
Brian Yencho
95bcc89178 Remove various unnecessary TODOs (#956) 2024-02-05 16:06:54 -06:00
David Perez
a74a16f2cc Update detekt and fix minor warnings (#955) 2024-02-05 15:34:26 -06:00
Oleg Semenenko
a3e7050067 BIT-1699 Fix initial pasword type not checking policy (#954) 2024-02-05 14:32:50 -06:00
David Perez
36db5d1a29 Update bitwarden sdk and login with device flow (#946) 2024-02-05 14:08:46 -06:00
renovate[bot]
fc9b70ec9f Update ruby/setup-ruby action to v1.171.0 (#692)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-05 13:51:27 -06:00
Brian Yencho
7ccc76243c Update Roboelectric to 4.11.1 (#953) 2024-02-05 13:09:14 -06:00
Brian Yencho
456eb032ff Cache gradle files on CI (#952) 2024-02-05 12:28:09 -06:00
Brian Yencho
446a9ef987 Use parallel garbage collection in tests (#950) 2024-02-05 12:11:55 -06:00
Lucas Kivi
0b6f1f4144 Support other autofill types (#948) 2024-02-05 11:42:42 -06:00
Lucas Kivi
6002a84fae Fix spelling error in file name (#949) 2024-02-05 08:42:21 -06:00
Lucas Kivi
7a042757ad Simplify tests with mocks (#947) 2024-02-05 08:41:51 -06:00
Sean Weiser
c79c7fbf77 BIT-1527: Wrap FileManager methods in io context (#945) 2024-02-01 14:52:29 -06:00
Brian Yencho
c27cd15f12 Use KSP for Hilt to improve build times (#944) 2024-02-01 14:38:39 -06:00
Brian Yencho
746478accd Used fixed timezome to fix failing Password History test (#943) 2024-02-01 12:24:22 -06:00
Ramsey Smith
89894c791b BIT-617: Vault Password History (#935) 2024-02-01 09:16:07 -07:00
David Perez
b6a4169424 Polling on pending requests screen (#942) 2024-02-01 09:42:40 -06:00
Brian Yencho
80d021b691 BIT-1682: Add more master password reprompts to Item Listing screen (#938) 2024-02-01 09:29:27 -06:00
Sean Weiser
448e8fbc59 BIT-779: Add UI tests for generator changes (#941) 2024-02-01 02:27:51 -06:00
Joshua Queen
8e4b3899fc BIT-1594: Send form element IDs (#929) 2024-02-01 02:22:52 -06:00
David Perez
5211490f63 Poll for auth request updates (#939) 2024-02-01 02:16:07 -06:00
Brian Yencho
96da42294e Ensure more overflow action types get reprompts on Search (#940) 2024-02-01 02:04:06 -06:00
Oleg Semenenko
6b7fa01c03 BIT-1646 Flip the order for the delete menu password prompt (#937) 2024-02-01 01:55:08 -06:00
Caleb Derosier
c10a0b12c8 BIT-784: Enforce send options policy (#933) 2024-02-01 01:46:44 -06:00
Joshua Queen
87aaf422ff BIT-1679: Adding element IDs for view item screen (#932) 2024-02-01 01:42:15 -06:00
Shannon Draeker
45c622fbf2 BIT-1687: Password reprompt for items (#936) 2024-02-01 01:35:05 -06:00
Sean Weiser
ae264de457 BIT-779: Enforce policies on passcode generator screen (#927) 2024-02-01 01:25:08 -06:00
David Perez
472b970c56 Handle navigation for auth requests from notification (#934) 2024-02-01 00:33:10 -06:00
Shannon Draeker
d6525ec917 BIT-785: Vault timeout policy (#924) 2024-01-31 23:05:09 -07:00
Joshua Queen
06e48f9beb BIT-1676: Attachment view element IDs (#931) 2024-02-01 00:43:28 -05:00
Lucas Kivi
3265a0bef4 BIT-1093: Setup TOTP auto copy settings (#928) 2024-02-01 05:33:28 +00:00
Brian Yencho
5f2ffd3358 BIT-1683: Show master password reprompts on Search Screen (#925) 2024-01-31 23:29:41 -06:00
Lucas Kivi
a3f0a8fcf0 BIT-1457: Setup autofill save request (#898) 2024-02-01 04:55:22 +00:00
Sean Weiser
f9f1e72cd4 BIT-1527: Handle attachment downloads (#894) 2024-01-31 22:55:10 -06:00
David Perez
45f3ba1e8b Remove unused function (#926) 2024-01-31 22:44:53 -06:00
Caleb Derosier
b4aea60535 BIT-782: Implement Personal Ownership policy support (#920) 2024-01-31 20:54:08 -07:00
Oleg Semenenko
9d553f68f1 BIT-1670: Add the initial autofill dialog (#922) 2024-01-31 21:50:58 -06:00
Joshua Queen
4bed2442eb BIT-1677: Add element IDs for edit item (#923)
Co-authored-by: Lucas Kivi <125697099+lucas-livefront@users.noreply.github.com>
2024-01-31 22:12:58 -05:00
David Perez
5cc722e7a2 Process push notification to display auth request notification (#919) 2024-01-31 21:02:12 -06:00
Oleg Semenenko
d6a254b1ee BIT-972 Add the import url (#903) 2024-01-31 20:50:45 -06:00
Sean Weiser
b4a24946d0 BIT-779: Adding UI logic to disable and limit controls under policy enforcement (#921)
Co-authored-by: Joshua Queen <joshua@livefront.com>
2024-01-31 20:36:07 -06:00
Shannon Draeker
4593c3863a BIT-783: Enforce Send restriction policy (#915) 2024-01-31 19:21:18 -07:00
Shannon Draeker
7e5264246e Create policy manager (#899) 2024-01-31 19:14:27 -07:00
Oleg Semenenko
41617d8702 Save the value for showing the initial autofill dialog (#916) 2024-01-31 19:28:32 -06:00
Oleg Semenenko
2df934fea4 BIT-973 Get the vault URL from the repo. (#911) 2024-01-31 19:27:44 -06:00
Joshua Queen
7fe331ace4 BIT-1645: Adding element IDs to the vault unlock screen (#917) 2024-01-31 20:17:38 -05:00
Lucas Kivi
299a6f5f3c BIT-1659-filter-out-reprompt-ciphers (#918) 2024-01-31 18:38:28 -06:00
Ramsey Smith
f0cc277bfd Add error dialog in VaultAddEditViewModel (#914) 2024-01-31 16:35:01 -07:00
Brian Yencho
da79a17c40 BIT-1661: Pre-populate Add Item screen during autofill save (#913) 2024-01-31 16:28:39 -06:00
David Perez
68a9ef18e6 BIT-1567: Do process auth requests if feature is disabled (#912) 2024-01-31 16:16:50 -06:00
Ramsey Smith
3d5f27584f BIT-506: Hard delete (#910) 2024-01-31 15:07:45 -07:00
David Perez
3ce0978fbc BIT-1560: Successfully login with device (#892) 2024-01-31 15:07:42 -06:00
Oleg Semenenko
f647c12846 BIT-1570 Make the name value appear in the dialog (#907) 2024-01-31 14:26:59 -06:00
Shannon Draeker
0be88f0826 Add a compose element for the policy warnings (#908) 2024-01-31 13:16:23 -07:00
Joshua Queen
697a7c89f1 BIT-1592: Adding element IDs for search and search sends (#906) 2024-01-31 13:42:43 -06:00
Shannon Draeker
854d36b15f BIT-778: Account recovery (#905) 2024-01-31 12:37:47 -07:00
Brian Yencho
5618a5c810 Allow users to navigate to Add Item screen for autofill save (#900) 2024-01-31 13:27:54 -06:00
Joshua Queen
2e122a8d53 BIT-1180: Adding element IDs for passphrases (#902) 2024-01-31 14:06:53 -05:00
Ramsey Smith
e9710f678c BIT-1575: Update cipher collections functionality (#904) 2024-01-31 12:04:28 -07:00
Joshua Queen
beeda7fbc0 BIT-1171: Element IDs for LoginApporvalScreen and Reset Password Screen (#901) 2024-01-31 13:23:27 -05:00
Oleg Semenenko
d7f1b090bd BIT-1283 Clear the clipboard after the settings interval (#891) 2024-01-31 11:15:48 -06:00
Oleg Semenenko
8dc4b0a792 BIT-1667: Navigate the user to the tooltip URI (#897) 2024-01-31 11:15:28 -06:00
Shannon Draeker
3ba16a0d76 Fix password reset (#896) 2024-01-31 09:33:27 -07:00
Brian Yencho
f541f7b5d6 Add AutofillSaveItem and related Intent helpers (#895) 2024-01-31 10:06:31 -06:00
Brian Yencho
2151b5dc6a Update Bitwarden SDK to 0.4.0-20240131.132449-88 (#893) 2024-01-31 08:55:01 -06:00
Brian Yencho
c7672b1c53 BIT-1538, BIT-1539, BIT-1660: Implement Search in autofill flow (#889) 2024-01-31 08:52:06 -06:00
Joshua Queen
563fd771dc Setup for generator policy implementation (#888) 2024-01-31 08:31:42 -06:00
David Perez
e03e7debdc Add loading states and navigation events to LoginWithDeviceScreen. (#890) 2024-01-31 01:41:53 -06:00
Oleg Semenenko
57857621f3 Save the clear clipboard frequency in settings. (#886) 2024-01-30 23:44:21 -06:00
David Perez
96849c8744 Listen to updates to login auth requests (#887) 2024-01-30 23:25:44 -06:00
David Perez
cae0f5c263 Update the CreateAuthRequests API to poll for updates (#884) 2024-01-30 22:04:46 -06:00
Shannon Draeker
69888aaad8 Fix API key name (#885) 2024-01-30 19:25:18 -07:00
David Perez
39f00f17f7 Add dialog state to LoginWithDevice state (#883) 2024-01-30 19:55:49 -06:00
Shannon Draeker
48437881d2 Fixed login bug (#882) 2024-01-30 17:24:00 -07:00
Oleg Semenenko
f0b2f487d6 BIT-1654 Add URI option menu (#877) 2024-01-30 18:22:03 -06:00
Lucas Kivi
a02a332a7c BIT-1093: Add TOTP copying to autofill flow (#879)
Co-authored-by: David Perez <david@livefront.com>
2024-01-30 18:14:58 -06:00
David Perez
a52581dbfc Minor cleanup of LoginWithDeviceViewModel (#881) 2024-01-30 17:52:24 -06:00
Sean Ephraim
d1fc3f5ac2 SA-115: Update localization strings to match Xamarin repo @ 0f22f27 (#876) 2024-01-30 17:49:19 -06:00
David Perez
5eda3adebd Add API for getting auth request updates (#880) 2024-01-30 17:38:17 -06:00
Ramsey Smith
bf3fc4c5cd BIT-1575: Collection Screen (#878) 2024-01-30 16:01:20 -07:00
Shannon Draeker
20f651d9e6 BIT-786: Export vault policy (#875) 2024-01-30 14:26:36 -07:00
Joshua Queen
e4a5798f01 BIT-1087: Adding navigation for the username types tooltip in generator. (#874) 2024-01-30 15:32:30 -05:00
Shannon Draeker
e3d118e097 BIT-620: Reset password screen (#871) 2024-01-30 13:19:37 -07:00
Brian Yencho
ad34ed4ee6 Add decodeFromStringOrNull for safer disk JSON parsing (#873) 2024-01-30 13:16:12 -06:00
David Perez
21d0b37a46 Add API for retrieving auth requests by ID (#872) 2024-01-30 13:02:31 -06:00
Ramsey Smith
3e6086fd3b Fix VaultAddEditViewModelTest (#870) 2024-01-30 10:35:22 -07:00
David Perez
b80c01411e Create separate API for authenticated auth requests (#868) 2024-01-30 17:21:47 +00:00
Shannon Draeker
e6e451e38a BIT-802: Enforce master password policy (#849)
Co-authored-by: Sean Weiser <125889608+sean-livefront@users.noreply.github.com>
2024-01-30 09:22:19 -07:00
Ramsey Smith
f04fdaf302 BIT-1309: Ownership in the add item screen (#831) 2024-01-30 09:11:46 -07:00
Joshua Queen
72b27a10cf BIT-756: Wrap startActivity in IntentManager with try catch (#865) 2024-01-30 09:59:32 -06:00
Brian Yencho
2cbd9f457e Get autofill enabled information more reliably (#867) 2024-01-30 09:43:55 -06:00
Joshua Queen
14b05f0156 BIT-478: Implementation for crash logging switch in settings screen (#864) 2024-01-30 01:11:01 -05:00
Brian Yencho
d60bb26053 Fix rebasing issue with Login URIs (#866) 2024-01-29 23:27:46 -06:00
Brian Yencho
98ac199dc6 BIT-1642: Pre-populate the add item screen URI during autofill (#863) 2024-01-29 22:27:25 -06:00
David Perez
248455c63a BIT-1574: Add pull to refresh behavior (#861) 2024-01-29 22:21:39 -06:00
Sean Weiser
d5c2b4192e BIT-1547: Hook up remaining push notification sync handling (#848) 2024-01-29 22:15:59 -06:00
Oleg Semenenko
4542bac2ed BIT-1653 Add functionality to new URI button (#862) 2024-01-29 22:03:56 -06:00
Brian Yencho
f4e92298a9 BIT-1641: Use correct matching logic for in-app autofill (#860) 2024-01-29 21:22:37 -06:00
Shannon Draeker
f092a9e45f Refactor vault unlock state to enum (#853) 2024-01-29 21:16:23 -06:00
Sean Ephraim
825bffeddb SA-114: Update Hebrew & Indonesian language localization codes/strings (#856) 2024-01-29 20:13:10 -06:00
Caleb Derosier
cdb473d7ad BIT-1508: Implement decline all pending requests & add filters (#845) 2024-01-29 19:48:45 -06:00
Lucas Kivi
251a3cc4e1 BIT-1506: block autofill for block listed URIs (#855) 2024-01-29 18:57:06 -06:00
Brian Yencho
3dacdf4148 Fix accidental hardcoded Intent key (#858) 2024-01-29 18:48:16 -06:00
Brian Yencho
3f17e752be BIT-1643: Add master password reprompt to autofill selection (#854) 2024-01-29 18:09:37 -06:00
David Perez
ce1531da9d Fix nullability bug in combineDataStates (#857) 2024-01-29 17:15:43 -06:00
David Perez
696ad2bc14 BIT-1646, BIT-1647: Launch action after password validation (#852) 2024-01-29 17:01:07 -06:00
Oleg Semenenko
f228022890 BIT-1648: Add the copy totp code overflow option (#850) 2024-01-29 16:40:54 -06:00
Lucas Kivi
d1e638e120 BIT-621: Add URI matching for autofill (#842) 2024-01-29 15:33:27 -06:00
Joshua Queen
7461fa6688 Add crash logging boolean to settings repository and settings disk source (#851) 2024-01-29 15:44:15 -05:00
Joshua Queen
8c69700872 Updated copy on about page to include bitwarden copyright information (#847) 2024-01-29 14:39:50 -05:00
Sean Ephraim
9de661d9e6 SA-113: Update localization strings (#807) 2024-01-29 13:03:02 -06:00
Shannon Draeker
08b2be47d4 Add PolicyInformation data structure (#846) 2024-01-29 12:27:26 -06:00
David Perez
71f830c159 BIT-1213: Add real password check to vault item screen (#844) 2024-01-29 08:17:16 -06:00
Oleg Semenenko
5248b3b204 BIT-1301 Adding icons to collection items (#840) 2024-01-28 23:31:20 -06:00
Brian Yencho
5bfcb71311 Show appropriate empty states for autofill flow (#843) 2024-01-28 22:42:13 -06:00
David Perez
e22b8b9e7e Add validity checks to ensure that changes to biometrics require a master password or pin to continue (#839) 2024-01-28 22:31:17 -06:00
Brian Yencho
7644d35ca2 Move validatePassword to AuthRepository and ensure errors are caught (#841) 2024-01-28 21:30:39 -06:00
Sean Weiser
10570b6396 BIT-1547: Setup needed logic to support push notification syncs (#837) 2024-01-28 20:48:27 -06:00
Brian Yencho
a405a4386f Add placeholder autofill URI matching (#838) 2024-01-28 20:06:53 -06:00
Oleg Semenenko
233cc5e6b1 BIT-1545 Allowing the user to search for verification code items (#836) 2024-01-28 18:52:49 -06:00
Brian Yencho
eaa6992209 Make CipherView.toAutofillCipherProvider public and add tests (#835) 2024-01-28 16:56:09 -06:00
Brian Yencho
eeb6ebd25e Update Vault Item Listing screen app bar for autofill (#834) 2024-01-28 16:34:36 -06:00
Oleg Semenenko
01622f1646 BIT-458, BIT-459: Add Folder Saving/Editing/Deleting (#832) 2024-01-28 14:54:18 -06:00
David Perez
576498cf5e BIT-1451, BIT-1453: logout on failed attempts (#833) 2024-01-28 13:07:16 -06:00
Brian Yencho
8f4e89f99d Send autofill selections back to autofill flow (#829) 2024-01-28 12:25:15 -06:00
David Perez
21b47720c9 BIT-1630: Add unlock with biometrics flow (#827) 2024-01-28 11:43:46 -06:00
Brian Yencho
4c9885d902 Rearrage mapping in createAuthRequest (#830) 2024-01-28 11:30:27 -06:00
Caleb Derosier
94af475226 BIT-1565: Approve and decline login requests (#818) 2024-01-28 10:59:34 -06:00
Oleg Semenenko
f04e9906f6 Adding the Repository folder calls. (#813) 2024-01-28 10:50:14 -06:00
Caleb Derosier
150af50558 BIT-1563: Handle POST auth-requests error on Login with Device (#828) 2024-01-28 10:34:51 -06:00
Brian Yencho
9d58cc0f3d Provide graceful fallbacks when there is no active user (#825) 2024-01-28 08:32:33 -06:00
David Perez
39a75ec890 BIT-614: Add ability to setup biometrics from account security screen (#826) 2024-01-27 23:27:59 -06:00
Oleg Semenenko
f06f912e82 BIT-1351 Sorting Items by name (#823) 2024-01-27 22:51:56 -06:00
David Perez
d9eddd21d5 Vault repo biometrics (#821) 2024-01-27 22:50:13 -06:00
David Perez
e696bce829 User settings repo to get biometrics enabled info (#824) 2024-01-27 22:23:30 -06:00
David Perez
cb9e8b469b Interfaces provided via Local Composition should be immutable (#822) 2024-01-27 21:30:51 -06:00
David Perez
f2b108b41c Add loading dialog support to account security screen (#820) 2024-01-27 20:44:58 -06:00
Caleb Derosier
7776e7d75f BIT-1631: Hide Pending requests button when approve requests is disabled (#819) 2024-01-27 18:35:38 -07:00
David Perez
cabe094f27 Add support to prompt for biometrics setup (#817) 2024-01-27 18:40:24 -06:00
Sean Weiser
51e9c7c600 BIT-1517: Add check for claimed organization domain to SSO ViewModel (#816) 2024-01-27 16:09:30 -06:00
Shannon Draeker
697e525ccd BIT-1273: Validate master password (#814) 2024-01-27 14:28:36 -07:00
David Perez
850e9f957e Add biometrics state to UnlockVaultViewModel (#815) 2024-01-27 13:56:41 -06:00
Brian Yencho
791c4e1b6a Use a Channel for generatorResultFlow implementation (#811) 2024-01-27 13:48:53 -06:00
Brian Yencho
6ac4c52f7e Navigate to the Vault Listing screen from autofill (#810) 2024-01-27 13:48:39 -06:00
David Perez
33909bdc68 Update biometrics state in AccountSecurityScreen (#812) 2024-01-27 13:39:04 -06:00
Oleg Semenenko
61c55788c4 Adding the Folder Api and Service (#809) 2024-01-27 11:56:22 -06:00
Caleb Derosier
032949e9d5 BIT-811 BIT-1566: Add Login Approval screen & hook up to Pending Requests (#808) 2024-01-27 10:54:30 -06:00
Shannon Draeker
e7333678a7 BIT-1277 BIT-1279: Confirmation dialog (#805) 2024-01-27 08:06:10 -06:00
Oleg Semenenko
6008e63820 BIT-458, BIT-459: Add screens for adding and editing folders (#795) 2024-01-26 17:09:07 -06:00
David Perez
82ac335563 Add isBiometricsEnabled boolean to UserState (#806) 2024-01-26 16:52:54 -06:00
Shannon Draeker
5e90b3ecad BIT-1272: Export vault screen (#804) 2024-01-26 14:52:57 -07:00
Caleb Derosier
ecddcf1761 BIT-810: Implement resend notification (#803) 2024-01-26 14:42:56 -07:00
Caleb Derosier
e1b1e74da6 Refactor logic for auth requests & decrypt all fingerprints (#800) 2024-01-26 14:17:21 -07:00
Joshua Queen
1ec3e54d53 BIT-971: Adding urls for two step login and change master password in… (#790) 2024-01-26 15:30:43 -05:00
David Perez
ac3e2601bf Add initial biometrics manager (#802) 2024-01-26 11:24:52 -06:00
Brian Yencho
6aca6a56d5 Use direct navigation to nested destinations (#801) 2024-01-26 10:59:32 -06:00
Joshua Queen
f3bfb60eaa BIT-805: Screen capture toggle setting implementation (#788) 2024-01-26 11:26:17 -05:00
Sean Weiser
3fa11bc0e0 BIT-816: Handle login attempt of SSO flow (#797) 2024-01-26 10:01:45 -06:00
Brian Yencho
4ffb7848fa Store SpecialCircumstance to SavedStateHandle (#799) 2024-01-26 09:35:31 -06:00
David Perez
adb15f81da Add storage for biometrics key (#798) 2024-01-26 00:22:07 -06:00
Lucas Kivi
bfde593a3d BIT-1316: Add compatibility for browser apps (#796) 2024-01-25 23:46:42 -06:00
Caleb Derosier
7760e02b84 BIT-1291: Initiate Login with Device flow (#791) 2024-01-25 19:50:09 -07:00
Lucas Kivi
803ae7d1fc Add Domains database (#784) 2024-01-25 19:17:03 -06:00
Shannon Draeker
bc2a940db4 BIT-918: Resend notification emails (#792) 2024-01-25 18:48:08 -06:00
David Perez
f4d672bec1 Add biometrics library (#794) 2024-01-25 17:56:19 -06:00
David Perez
6d623ba2e6 BIT-1184: Add pending deletion state to display deletion dialog (#793) 2024-01-25 17:22:07 -06:00
Oleg Semenenko
8c07c7e0f0 Complete the UI for the Folders screen (#783) 2024-01-25 16:58:11 -06:00
Shannon Draeker
0b50ca7fb2 BIT-1490: Two factor login (#775) 2024-01-25 15:32:09 -06:00
Ramsey Smith
5e4719ec30 BIT-503: Move item to trash from edit screen (#786) 2024-01-25 15:07:05 -06:00
David Perez
9f37706e24 BIT-1418: Add premium feature restriction notice to attachments (#787) 2024-01-25 14:23:51 -06:00
David Perez
cd61ccc38b BIT-1407: Allow users to add attachments (#782) 2024-01-25 13:46:03 -06:00
Caleb Derosier
44a3b61335 BIT-809: Generate fingerprint on Login with Device (#781) 2024-01-25 13:26:43 -06:00
Joshua Queen
966c05452a Adding screen capture allow key to settings disk source (#780) 2024-01-25 13:25:28 -06:00
Joshua Queen
3c56adbf45 Navigate directly to generator when edited item's password or username fields are empty (#785) 2024-01-25 13:25:01 -06:00
David Perez
6e80b7056c Add flow for creating attachments (#777) 2024-01-25 11:46:37 -06:00
Sean Weiser
95cace026a Remove unneeded argument and add parallel forks for unit tests (#779) 2024-01-25 10:54:56 -06:00
Shannon Draeker
8522b9968f BIT-917 BIT-1489: Show two factor auth view (#756) 2024-01-25 09:46:24 -07:00
David Perez
9881a88360 Add method for encrypting an attachment (#774) 2024-01-25 10:33:54 -06:00
Brian Yencho
bfa0d4e6f9 Update test memory to avoid java heap errors (#778) 2024-01-25 09:58:02 -06:00
David Perez
4fe37f3910 Move fileUploadType into it's own file (#773) 2024-01-24 23:01:28 -06:00
Lucas Kivi
d7cc8d4d5b Perform deeper login data parsing (#758) 2024-01-24 22:38:16 -06:00
Oleg Semenenko
2cee894395 BIT-1402 adding Password checker to Add Edit Screen (#769) 2024-01-24 21:48:28 -06:00
Oleg Semenenko
a9fb72e67d BIT-1561 Fixing the UI elements in Verification code screen (#771) 2024-01-24 20:48:34 -06:00
Joshua Queen
f6494ccfbc BIT-748: Settings about, rate app (#765) 2024-01-24 20:24:24 -06:00
David Perez
aa4b7e7d03 Display the selected attachment name (#770) 2024-01-24 19:50:47 -06:00
David Perez
cc2990dd9c Add support for deleting an attachment (#768) 2024-01-24 19:10:22 -06:00
Oleg Semenenko
0f385a9c48 BIT-1339 Add TOTP item to detail screen (#744) 2024-01-24 18:31:13 -06:00
David Perez
cb3dc71eab Add API support for deleting an attachment (#767) 2024-01-24 18:07:13 -06:00
Brian Yencho
22a27bc370 Update Bitwarden SDK to 0.4.0-20240124.173807-65 (#766) 2024-01-24 16:39:58 -07:00
Joshua Queen
b5b7e1ed5b BIT-1496: Generator Prompt Overwrite Confirmation (#755) 2024-01-24 18:14:33 -05:00
David Perez
9b9e184bd5 Rename launchActivityForResult to getActivityResultLauncher (#764) 2024-01-24 17:01:31 -06:00
Shannon Draeker
3995aa7505 Add support for different login methods (#762) 2024-01-24 15:54:25 -07:00
Ramsey Smith
78d339be8b BIT-1410: Move to organization from edit item screen (#760) 2024-01-24 16:50:47 -06:00
Brian Yencho
789835f2a4 BIT-1092: Store and expose value for disabling autofill save prompt (#763) 2024-01-24 16:46:53 -06:00
Brian Yencho
a1f647dc7c Update Bitwarden SDK to 0.4.0-20240123.161500-64 (#761) 2024-01-24 16:19:42 -06:00
David Perez
eb6e293387 Add fileChoose callback to handler to ensure it is remembered (#759) 2024-01-24 16:14:01 -06:00
Caleb Derosier
43815375f9 BIT-1559: Implement GET auth-requests (#752) 2024-01-24 14:44:15 -07:00
David Perez
334944a626 Display attachments in the UI (#754) 2024-01-24 15:08:02 -06:00
Lucas Kivi
9dfe0b8963 Consolidate username and email autofill views (#757) 2024-01-24 14:47:06 -06:00
Lucas Kivi
e21ef28310 Lazily determine autofill setting (#753) 2024-01-24 14:03:26 -06:00
Vince Grassia
775c703438 Update Renovate config (#749) 2024-01-24 12:56:54 -07:00
Ramsey Smith
86d0736858 BIT-1551: Restrict cloning to items not assigned to a collection (#751) 2024-01-24 11:24:51 -07:00
Brian Yencho
7665f62a98 Rename URI detection method related VM and Screen items add add tests (#750) 2024-01-24 10:51:07 -06:00
Joshua Queen
25a6123a3e BIT-71: Adding logic for password hint implementation (#748) 2024-01-24 11:30:06 -05:00
David Perez
7699a6e9d7 Add initial attachments screen shell (#745) 2024-01-24 10:26:45 -06:00
Sean Weiser
b98fba3b9e Handle SSO prevalidation and custom tab launch (#743) 2024-01-24 10:18:21 -06:00
Ramsey Smith
df8dd02851 BIT-639: Restore items from trash (#735) 2024-01-24 09:00:13 -07:00
Brian Yencho
d5f2c0c91b BIT-1094: Store default URI match detection type (#747) 2024-01-24 09:57:08 -06:00
David Perez
8fc3f43c66 Hide overflows with no items (#746) 2024-01-24 08:59:42 -06:00
Brian Yencho
39ef26e414 BIT-1454: Allow automatic sync only after 30 minutes from previous sync (#742) 2024-01-23 22:04:44 -06:00
Oleg Semenenko
282fe84b9f Updating getAuthCodesFlow to update values on emission. (#741) 2024-01-23 21:55:08 -06:00
David Perez
72daa3b89f BIT-1282: Add UI for Vault Sync (#740) 2024-01-23 19:47:18 -06:00
David Perez
ae49dd07a0 Vault screen overflow option actions (#739) 2024-01-23 18:32:57 -06:00
Caleb Derosier
d795b288c3 BIT-1508: Add Pending Login Requests screen (#738) 2024-01-23 17:25:27 -07:00
Lucas Kivi
0610a8b983 BIT-1294: Add autofill cipher handling (#731) 2024-01-23 17:04:28 -06:00
David Perez
33de39dbf1 Add a VaultHandlers class to more easily pass around lambdas (#737) 2024-01-23 16:54:31 -06:00
David Perez
8efb52b332 Update createMockSendView to make a more realistic SendView (#736) 2024-01-23 16:36:25 -06:00
David Perez
336e8a96cd Add overflow options to the listing screen and the search screen (#734) 2024-01-23 16:28:01 -06:00
Brian Yencho
b3453b62fe Decouple unlocking and syncing and add syncIfNecessary (#733) 2024-01-23 14:51:15 -06:00
Lucas Kivi
98ed4765a1 Update CipherView subtitle generation (#730) 2024-01-23 13:33:30 -06:00
David Perez
b4436664f8 Add storage for the last sync date (#732) 2024-01-23 13:15:40 -06:00
David Perez
8f264140e3 BIT-495: Add search with complete send support (#727) 2024-01-23 12:24:24 -06:00
Oleg Semenenko
a6200e638b BIT-1338 Finish Verification Code Screen Implementation (#721) 2024-01-23 12:01:39 -06:00
David Perez
c6f6a4c7ca Add a loading dialog to the Other Screen (#729) 2024-01-23 10:54:08 -06:00
Brian Yencho
2b97f0d897 BIT-1430: Add migration from SecureStorage (#728) 2024-01-23 09:59:27 -06:00
Oleg Semenenko
0cb0b13aec BIT-540 Adding Custom Field Edit Actions (#723) 2024-01-23 08:18:58 -06:00
Oleg Semenenko
42f7776e68 BIT-1400 Fixing the vault item count to not include trash items (#722) 2024-01-22 22:45:40 -06:00
David Perez
15a2bd93fe Add events for the search screen (#726) 2024-01-22 22:35:46 -06:00
Ramsey Smith
5818251578 BIT-1230: Show URI once for login items (#716) 2024-01-22 22:16:03 -06:00
David Perez
a78fce43b0 Add auto-focus to search toolbar (#725) 2024-01-22 21:42:16 -06:00
Sean Weiser
beceed2542 BIT-816: Add handling for SSO intents (#724) 2024-01-22 21:29:03 -06:00
Joshua Queen
c2aec15900 Adding the ability to add URIs as a comma delimited list in block auto fill (#718) 2024-01-22 21:15:08 -05:00
Joshua Queen
5f34b21979 BIT-72: Adding UI and navigation for the master password hint screen (#720) 2024-01-22 19:10:41 -05:00
Joshua Queen
46541b2549 BIT-1534: Updating keyboard type in block auto fill screen (#719) 2024-01-22 18:50:48 -05:00
Brian Yencho
8c5a7f3aff Add checks for locked vault to autofill (#703) 2024-01-22 17:29:51 -06:00
David Perez
c455802255 Replace Horizontal divider with modifier extension (#715) 2024-01-22 16:59:24 -06:00
David Perez
95dc854eac Add composable for search toolbar (#714) 2024-01-22 16:29:41 -06:00
Brian Yencho
47fe0b7e8b Ensure a SpecialCircumstance is scoped to a single overall graph (#712) 2024-01-22 16:14:06 -06:00
Brian Yencho
6aef3f96ba BIT-1462: Add Vault suggestion to autofill (#699) 2024-01-22 16:13:05 -06:00
Ramsey Smith
d7631e7d45 BIT-526: Clone vault item (#713) 2024-01-22 15:03:20 -07:00
David Perez
d66c29ca54 Add removeDiacritics helper method (#711) 2024-01-22 14:21:07 -06:00
Joshua Queen
1d6f6135bd BIT-1147, BIT-1487: Implementing blocking auto-fill for specific URIs (#710) 2024-01-22 14:33:51 -05:00
Brian Yencho
822546d255 Ensure the Custom Chrome tab is removed from the backstack (#708) 2024-01-22 10:20:24 -06:00
David Perez
acbb24dc70 Move parcelable annotation onto implementation classes (#709) 2024-01-22 10:18:28 -06:00
David Perez
a757c0f86a Add basic navigation for the search screen (#707) 2024-01-22 09:23:32 -06:00
Brian Yencho
19c499cca4 Add WebAuthCallbackActivity to handle hCaptcha callbacks (#705) 2024-01-22 09:08:28 -06:00
Brian Yencho
6805d68256 Replace string-based static mocks with function references (#706) 2024-01-22 07:59:59 -06:00
David Perez
a82ecd88ea Fix deletion date formatting (#704) 2024-01-21 20:46:09 -06:00
Ramsey Smith
95a7ba2154 BIT-1408: Delete cipher (#691) 2024-01-21 16:06:14 -07:00
David Perez
c5bb3c14a0 BIT-1518: Process shared sends (#698) 2024-01-21 16:24:53 -06:00
Brian Yencho
a4fefe447d BIT-1486: Use inline autofill based on user's setting (#702) 2024-01-21 13:31:26 -06:00
Brian Yencho
997bfa3f41 Ensure we only send ReceiveFirstIntent once (#701) 2024-01-21 11:35:39 -06:00
Oleg Semenenko
39b47c8e80 Adding the UI and ViewModel (#700) 2024-01-21 10:52:28 -06:00
Oleg Semenenko
638ff002f0 Adding Navigation to the verification code screen and skeleton UI (#697) 2024-01-20 15:05:16 -06:00
Sean Weiser
e0ae6ddfb9 BIT-1286: Enable loading dialog when logging in via SSO (#696) 2024-01-20 12:12:08 -06:00
Sean Weiser
0eff337e6b BIT-1286: Check for Internet connection before logging in via SSO (#695) 2024-01-20 11:06:55 -06:00
Joshua Queen
c4bf32e132 BIT-1147: Adding UI for empty and content view states in BlockAutoFillScreen (#688) 2024-01-20 10:18:56 -06:00
Sean Weiser
d54049983b BIT-1286: Check for empty organization ID on SSO login screen (#694) 2024-01-20 09:41:50 -06:00
Brian Yencho
0b7498b256 Use default value when navigating to Add Send as root (#693) 2024-01-20 09:30:54 -06:00
Oleg Semenenko
1528f6d4fc Add TOTP code generation (#687) 2024-01-19 16:40:56 -06:00
David Perez
3f6e1593a8 BIT-1499 listing screen pull-to-refresh (#690) 2024-01-19 16:16:15 -06:00
Brian Yencho
98f358330a Update various import and formatting issues (#689) 2024-01-19 16:01:08 -06:00
Brian Yencho
321489d75f BIT-1498: Allow external navigation to Add Send screen (#685) 2024-01-19 15:01:43 -06:00
Brian Yencho
a153daae1d Update Bitwarden SDK to 0.4.0-20240119.185557-52 (#683) 2024-01-19 13:58:12 -06:00
David Perez
d8a5ddf924 Add padding to the bottom of the list screen (#686) 2024-01-19 13:52:01 -06:00
David Perez
0b1a01dcc8 Hide overflow when there are no items (#684) 2024-01-19 13:04:07 -06:00
David Perez
b9a91f2907 Add sealed class to model reusable overflow actions (#682) 2024-01-19 13:03:38 -06:00
Caleb Derosier
536c4653d2 BIT-808: Conditionally show log in with device on login (#681) 2024-01-19 09:29:46 -07:00
David Perez
0f499f8e5a BIT-1411, BIT-1414: Add delete send confirmation dialog (#680) 2024-01-19 09:55:51 -06:00
Sean Weiser
570ee8270d BIT-1360: Prompt for push notification permission when approving passwordless logins (#677) 2024-01-19 09:35:05 -06:00
David Perez
00a69590c0 Add support for removing passwords and deleting sends from the list screen (#679) 2024-01-18 23:41:53 -06:00
David Perez
63b09ab5c1 Add helper method for getting sendView icons (#678) 2024-01-18 23:03:52 -06:00
Brian Yencho
0527da6b74 Disable inline autofill toggle when autofill is disabled (#674) 2024-01-18 22:00:28 -06:00
David Perez
ebc5a38afc BitwardenListItem should use persistable lists (#676) 2024-01-18 21:50:09 -06:00
David Perez
a3400800d3 Add trailing icons for sends (#675) 2024-01-18 21:00:06 -06:00
David Perez
7e6b9f3364 BIT-1501: Apply vault item list filters (#673) 2024-01-18 20:06:03 -06:00
Joshua Queen
03fe918668 BIT-693: Password strength indicator sdk update (#672) 2024-01-18 18:16:07 -05:00
Ramsey Smith
3703aeb86b BIT-769: Move to organization functionality (#670) 2024-01-18 15:59:22 -07:00
David Perez
a6bdb00e50 Add overflow items to sends listings (#665) 2024-01-18 16:45:09 -06:00
Joshua Queen
801815f5a7 BIT-1147: Adding navigation to block auto fill screen and skeleton UI (#671) 2024-01-18 17:44:12 -05:00
Joshua Queen
0daaeb5961 BIT-1166: Adding element ids for the account switcher (#669) 2024-01-18 14:46:56 -05:00
Oleg Semenenko
838778e1db BIT-541 Adding the icons for Apple and Android (#668) 2024-01-18 13:23:20 -06:00
Ramsey Smith
f505c648c0 Storing vault filter types in memory (#666) 2024-01-18 12:03:44 -07:00
Joshua Queen
ffcdc005c8 BIT-1181: Adding element ids for username generator screen (#667) 2024-01-18 12:58:45 -06:00
Brian Yencho
841c7e8c35 BIT-1488: Track changes in autofill status and send users to settings (#663) 2024-01-18 11:17:56 -06:00
Joshua Queen
a6e721e4f1 BIT-1179-adding element ids for password generation screen (#664) 2024-01-18 12:11:31 -05:00
Sean Weiser
655c0c93e3 Save state of approving passwordless logins setting and setup initial UI (#644) 2024-01-18 09:43:22 -06:00
David Perez
27bcae8468 Add basic overflow for list screen (#662) 2024-01-18 08:31:30 -06:00
David Perez
93d6c338db Fix minor lint errors (#660) 2024-01-17 23:55:58 -06:00
David Perez
8fb949ee92 Implement navigation for listing sends (#661) 2024-01-17 23:36:02 -06:00
David Perez
67d0c1afb3 Create sealed class for the ItemListingType Vault (#659) 2024-01-17 23:05:56 -06:00
David Perez
0a618853c5 BIT-493: Add full file send support (#651) 2024-01-17 22:58:13 -06:00
Brian Yencho
5fe04343b6 Remove now-unsupported Accessibility and Draw Over autofill options (#658) 2024-01-17 22:30:48 -06:00
Joshua Queen
1405b512f0 BIT-1177: Added test tags for password history (#656) 2024-01-17 21:35:29 -06:00
Brian Yencho
778c81df58 BIT-1148: Add storage for blocked autofill URIs (#657) 2024-01-17 21:30:25 -06:00
Oleg Semenenko
71460f2c39 BIT-541, 1370 Adding icon loading for login items (#654) 2024-01-17 21:14:23 -06:00
Brian Yencho
c32a7d18b1 Hook up inline autofill setting to UI (#653) 2024-01-17 20:38:51 -06:00
Joshua Queen
3868a71e41 BIT-1178: Adding element ids for the generator (#655) 2024-01-17 18:12:45 -05:00
David Perez
1d6d182c58 Maintain updated premium state in VaultViewModel (#652) 2024-01-17 16:31:25 -06:00
David Perez
3c452a42b9 Clean up lint warnings in tests (#650) 2024-01-17 16:03:33 -06:00
Joshua Queen
d7d1742de6 BIT-1169: Adding element ids for the environment screen (#649) 2024-01-17 16:46:00 -05:00
David Perez
f103fead43 Rename createSend to createTextSend (#647) 2024-01-17 15:28:11 -06:00
Brian Yencho
34e03a17fa Remove unnecessary SettingsRepository.clearData (#648) 2024-01-17 15:28:06 -06:00
David Perez
1748c7402a Add underlying support for file sends (#646) 2024-01-17 14:41:18 -06:00
Brian Yencho
e49a2d2349 BIT-833: Add storage for "use inline autofill" setting (#645) 2024-01-17 14:15:31 -06:00
Joshua Queen
59732a4ba1 BIT-1054, BIT-1055: Adding modal generator UI and navigation from Add/Edit item (#643) 2024-01-17 13:20:38 -05:00
Brian Yencho
5d388bffe7 BIT-1165: Log out the current user after maximum invalid unlock attempts (#642) 2024-01-17 07:53:01 -06:00
Caleb Derosier
6fb36a5fa9 BIT-1327: Add support for theme selection (#641) 2024-01-16 16:41:34 -07:00
Ramsey Smith
110392e94c BIT-844: Move to Organization UI (#638) 2024-01-16 15:53:45 -07:00
David Perez
b30a4368d8 Add initial file chooser (#639) 2024-01-16 16:25:59 -06:00
Brian Yencho
a9338cc743 BIT-1470, BIT-1475: Fix Proguard issues on recent builds (#640) 2024-01-16 16:21:50 -06:00
Lucas Kivi
3efbd72a41 BIT-1458: update overlay autofill (#634) 2024-01-16 11:43:13 -06:00
Brian Yencho
8fdcd0ecfb Add storage for invalid lock attempts (#637) 2024-01-16 11:10:26 -06:00
Brian Yencho
00c339b820 Use SharedPreferences.edit helper whenever possible (#636) 2024-01-16 10:01:13 -06:00
David Perez
b12a28962b Add method to request multiple permissions at once (#633) 2024-01-16 09:54:35 -06:00
Brian Yencho
ca18c1417a BIT-1321, BIT-1014: Implement Verify PIN screen (#635) 2024-01-16 09:46:15 -06:00
Brian Yencho
d9cbca5999 Add ability to set a PIN to SettingsRepository (#631) 2024-01-16 07:59:55 -06:00
Lucas Kivi
c44e9aa75a BIT-1320: Add inline UI (#624) 2024-01-15 22:37:50 -06:00
Brian Yencho
de290aaaf9 Add getPinProtectedUserKey to VaultSdkSource (#632) 2024-01-15 22:18:22 -06:00
David Perez
ed884592b0 Provide IntentManager from compositionLocal (#630) 2024-01-15 21:27:07 -06:00
Brian Yencho
d14c1fe985 Update Bitwarden SDK to 0.4.0-20240115.154650-43 (#629) 2024-01-15 20:59:00 -06:00
David Perez
16667453ca Add support for a localPermissionsManager (#628) 2024-01-15 18:09:13 -06:00
Oleg Semenenko
62827092e4 Modified the isIconLoadingDisabled setting to be a flow (#626) 2024-01-15 17:51:24 -06:00
Joshua Queen
084b1a70bd Adding navigation for generator modals (#627) 2024-01-15 18:35:03 -05:00
Brian Yencho
e6cb1fc357 Add PIN entry dialog and confirmation UI (#625) 2024-01-15 16:50:01 -06:00
David Perez
c30f3bb8e7 Add network security config (#623) 2024-01-15 14:24:57 -06:00
David Perez
f47ebdbcf8 Remove explicit english US strings and move non-translatable strings into their own file (#622) 2024-01-15 13:39:16 -06:00
David Perez
2f0ae889e4 BIT-461: Add pull-to-refresh to vault screen (#619) 2024-01-15 13:21:28 -06:00
Ramsey Smith
d51fa8f1ec Move to organization navigation (#620) 2024-01-15 11:58:20 -07:00
Brian Yencho
c6173d0a47 Make SyncResponseJson.Send.text nullable (#621) 2024-01-15 12:23:52 -06:00
David Perez
0b6b1ccade BIT-1268: Pull-to-refresh for sends screen (#618) 2024-01-15 10:40:03 -06:00
Oleg Semenenko
0d4fec4c91 Add persistence for isImageLoadingEnabled appearance setting (#612) 2024-01-15 10:26:43 -06:00
David Perez
52d74c97c1 Add support for the pull-to-refresh in settings (#615) 2024-01-15 09:41:14 -06:00
David Perez
6143f35572 Create a navigation graph for the generator tab (#617) 2024-01-15 08:47:31 -06:00
David Perez
7b8a10d7df Navigate to send graph properly (#616) 2024-01-15 08:46:59 -06:00
Lucas Kivi
691ff01f39 Refactor autofill parser to take a FillRequest (#614) 2024-01-14 21:21:22 -06:00
Brian Yencho
7e8b9897bd Add unlockVaultWithPinAndSync to VaultRepository (#613) 2024-01-14 21:08:35 -06:00
David Perez
b58f3d5bf0 Add underlying pull-to-refresh support to BitwardenScaffold (#610) 2024-01-14 17:58:03 -06:00
Brian Yencho
4096b37d86 BIT-746, BIT-1120: Implement session timeout functionality (#605) 2024-01-14 17:30:44 -06:00
Brian Yencho
9bdd5615e6 Add persistence for PIN-unlock related data (#611) 2024-01-14 16:56:42 -06:00
Brian Yencho
827ef29477 BIT-463: Add warning dialog when selecting VaultTimeoutAction.LOGOUT (#608) 2024-01-14 15:13:21 -06:00
Brian Yencho
cd295c4a3a Add VaultSdkSource.derivePinKey (#609) 2024-01-14 14:32:43 -06:00
David Perez
c7c96e4d2f Handle delete and remove password options from SendScreen (#607) 2024-01-14 13:55:59 -06:00
David Perez
ace356f4ae BIT-1445: Allow manual text entry on stepper (#593) 2024-01-14 12:36:58 -06:00
Brian Yencho
708c942edc Update the current user's last active time when navigating (#606) 2024-01-14 10:26:48 -06:00
Brian Yencho
7acb369d9f Add logout manager (#604) 2024-01-14 09:58:14 -06:00
Brian Yencho
a37971a986 Add clearData calls DiskSources (#603) 2024-01-14 08:19:11 -06:00
Lucas Kivi
2364cbf0ed BIT-1315: Add dummy data fulfillment (#602) 2024-01-13 15:51:38 -06:00
Brian Yencho
2ea16b180e Add persistence for a user's "last active time" (#601) 2024-01-13 11:47:39 -06:00
Sean Weiser
c98f51e719 Check isAuthenticated status within PushManager (#600) 2024-01-13 11:38:45 -06:00
Brian Yencho
688fcb54e8 Add AppForegroundManager (#599) 2024-01-13 11:15:06 -06:00
Brian Yencho
661ec21f2f Remove waitForIdle calls from account switcher tests (#598) 2024-01-13 10:19:12 -06:00
David Perez
7888638949 Remove BitwardenReadOnlyTextFieldWithActions (#597) 2024-01-13 08:51:29 -06:00
Brian Yencho
8297211fd0 Allow for null access tokens for soft logout states (#596) 2024-01-12 15:57:43 -06:00
David Perez
190bfa2a3f Add send delete confirmation dialog (#595) 2024-01-12 15:54:46 -06:00
Caleb Derosier
8fa9f337ad BIT-1328: Add support for changing language with picker (#577) 2024-01-12 14:43:18 -07:00
Lucas Kivi
94a45e4e21 Fix bug in test (#594) 2024-01-12 14:23:03 -06:00
Sean Weiser
03131449b1 BIT-1362 Receive and expose push notification events from PushManager (#581) 2024-01-12 13:39:27 -06:00
David Perez
d3b2d19345 Dialogs should persist past a rotation (#592) 2024-01-12 13:07:14 -06:00
Lucas Kivi
254a4e9a0e Move AutofillView data into a wrapper class (#590) 2024-01-12 12:56:00 -06:00
David Perez
820a9b333d Add delete and remove password options items for send (#591) 2024-01-12 12:53:15 -06:00
Lucas Kivi
2f3435b55b Add URI generation algorithm to autofill parsing (#582) 2024-01-12 12:45:56 -06:00
Ramsey Smith
c5a3340ac5 BIT-1304: Options menu UI for view item (#580) 2024-01-12 11:05:50 -07:00
Brian Yencho
cdb80095a6 Ensure 15 minute timeout does not show up as Custom (#589) 2024-01-12 11:46:18 -06:00
David Perez
63a762cdb9 Convert UI list to persistent list (#588) 2024-01-12 10:47:29 -06:00
Joshua Queen
f6e54e03a2 BIT-1419: Username generation options persistence (#586) 2024-01-12 10:12:40 -06:00
David Perez
3ea60f96cf Add the underlying support for deleting a Cipher (#587) 2024-01-11 22:37:24 -06:00
David Perez
59c817d55c BIT-1437: Implement remaining overflow options (#585) 2024-01-11 21:53:10 -06:00
David Perez
46c6545cd5 Add the Delete Send API (#584) 2024-01-11 21:23:04 -06:00
Brian Yencho
b26ee0f269 Persist VaultTimeoutAction as a String (#583) 2024-01-11 20:59:57 -06:00
David Perez
4d386e1001 Remove the send password (#579) 2024-01-11 20:06:30 -06:00
Ramsey Smith
2cf011a3d7 BIT-513: View Card Item (#573) 2024-01-11 16:16:55 -07:00
David Perez
4de47c5a04 Convert AddSendEvent for ShowToast to use Text (#578) 2024-01-11 16:20:05 -06:00
Oleg Semenenko
d4ec4c2e0e BIT-1337 Adding new section for verification codes (#567) 2024-01-11 15:49:51 -06:00
David Perez
f1ea1bfa02 Modify Add Sends UI to allow for editing existing sends (#575) 2024-01-11 15:44:47 -06:00
Brian Yencho
6598eba398 BIT-462: Add UI for custom vault timeout (#576) 2024-01-11 14:42:12 -06:00
Lucas Kivi
9da52493a0 Refactor autofill flow to partition fill data by cipher (#571) 2024-01-11 13:22:41 -06:00
Brian Yencho
ad1c2f6f23 Add additional auto-unlock key store/clear logic to VaultLockManager (#574) 2024-01-11 11:44:03 -06:00
David Perez
76ea090dfc BIT-1398: Update Bitwarden SDK and remove temporary SendViewKey (#572) 2024-01-11 09:22:27 -06:00
David Perez
009195d4cb Add the UI for the overflow menu (#570) 2024-01-10 22:17:36 -06:00
David Perez
404f617e22 Add custom typography for BodySmallProminent (#569) 2024-01-10 17:21:12 -06:00
David Perez
b1e1862f84 Add the decrypted SendView to the UpdateSendResult (#568) 2024-01-10 16:43:49 -06:00
Brian Yencho
a232211fc5 BIT-1432: Add FifteenMinutes to VaultTimeout (#565) 2024-01-10 14:26:33 -06:00
David Perez
121c22b36f Create reusable custom date chooser (#566) 2024-01-10 14:16:02 -06:00
David Perez
b68021aeb5 Add support for retrieving a single send by ID from the VaultRepository (#564) 2024-01-10 13:31:31 -06:00
Lucas Kivi
451599b85a Remove scaffolding for identity autofill (#563) 2024-01-10 13:00:31 -06:00
Oleg Semenenko
d90f79ed2d BIT-1103 Adding the ability to delete totp text (#562) 2024-01-10 11:34:55 -06:00
Brian Yencho
65bb2e5efd Clear the users auto-unlock key on logout (#561) 2024-01-10 10:10:22 -06:00
Brian Yencho
53108c0b9d BIT-1019, BIT-1190: Add "Never Lock" vault timeout implementation (#559) 2024-01-10 09:45:11 -06:00
David Perez
03291bafcf BIT-488 Update UI for Send notes field (#560) 2024-01-10 09:21:50 -06:00
David Perez
53be2a0388 Add navigation support for editing a send (#558) 2024-01-09 20:35:46 -06:00
David Perez
ffff3221e1 Update the Send max access count logic (#557) 2024-01-09 20:35:05 -06:00
Ramsey Smith
378ff21c3c Store information when switching vault add edit types. (#554) 2024-01-09 14:51:01 -07:00
David Perez
8da6fd0471 Add support for the Send expiration date UI (#556) 2024-01-09 15:43:27 -06:00
Sean Weiser
08fd7477cd BIT-1361 Setup GCM and Bitwarden push registration (#547) 2024-01-09 14:06:15 -06:00
David Perez
a6657e427e Minor cleanup of AddSend composables (#555) 2024-01-09 13:43:08 -06:00
David Perez
5755ade375 Add send data to VaultDataStateFlow (#553) 2024-01-09 13:18:40 -06:00
David Perez
ef128b4907 BIT-483: Add support for enumerated deletion options (#551) 2024-01-09 12:36:46 -06:00
Lucas Kivi
765b4b9022 BIT-1314: Update the Presentations method to be correct (#552) 2024-01-09 12:07:26 -06:00
Brian Yencho
3c7d1d91ef Add VaultLockManager (#550) 2024-01-09 12:05:06 -06:00
David Perez
488302a90b BIT-484: Add deletion date and time pickers (#548) 2024-01-09 11:46:15 -06:00
Oleg Semenenko
f2eb46020d BIT-1069 Adding error handling for scanning (#549) 2024-01-09 11:26:40 -06:00
Brian Yencho
4776777759 Add VaultState.unlockingVaultUserIds and clean up the vault unlock logic (#546) 2024-01-08 22:56:35 -06:00
Brian Yencho
3cc2f2143f Add auto unlock key storage (#544) 2024-01-08 22:18:40 -06:00
Brian Yencho
26cbdc27f4 Add VaultSdkSource.getUserEncryptionKey (#545) 2024-01-08 22:07:58 -06:00
Brian Yencho
3974d66b74 Add EncryptedSharedPreferences and BaseEncryptedDiskSource (#543) 2024-01-08 21:52:26 -06:00
David Perez
e85907d6e7 Add basic date and time pickers (#542) 2024-01-08 21:33:43 -06:00
Lucas Kivi
23a6852dbc BIT-1314: Add autofill node traversal with basic UI fulfillment (#541) 2024-01-08 18:43:57 -06:00
Joshua Queen
ecab23fe58 BIT-1336: Adding random word username generation (#540) 2024-01-08 17:50:17 -05:00
joshua-livefront
586b426f20 BIT-1334: Adding generation for catch all email usernames (#538) 2024-01-08 15:52:19 -05:00
Ramsey Smith
4885178d9e Add linked fields for identity (#536) 2024-01-08 13:23:22 -07:00
Brian Yencho
a3f18bfc5d Fix intermittent failures in Account Switcher tests (#539) 2024-01-08 14:21:43 -06:00
David Perez
a5d463ca35 BIT-480, BIT-1386: Allow for saving a text send (#535) 2024-01-08 13:41:09 -06:00
Brian Yencho
45a9100fde Set Settings defaults on login and clear them on logout (#537) 2024-01-08 13:31:46 -06:00
Oleg Semenenko
ec867ae200 BIT-1114 Add code manual entry (#523) 2024-01-08 11:38:16 -06:00
David Perez
ff48d6a9aa Ensure hasPremium value is set on profile (#534) 2024-01-08 11:29:55 -06:00
Brian Yencho
12e27bcba2 Improve CI performance by excluding unnecessary FDroid tasks (#533) 2024-01-08 10:21:53 -06:00
David Perez
ff82dc5918 BIT-482: Display share sheet after saving a new send (#532) 2024-01-08 10:10:06 -06:00
Brian Yencho
9be101ecde Hook up vault timeout action to repo (#530) 2024-01-08 09:56:03 -06:00
Brian Yencho
de9e32f6aa BIT-363, BIT-1323: Add time interval options to session timeout menu (#529) 2024-01-08 09:19:55 -06:00
Brian Yencho
8e95277e89 Update Bitwarden SDK to 0.4.0-20240108.121805-25 (#531) 2024-01-08 09:19:35 -06:00
Brian Yencho
4afee19a05 Fix ClassCastException from R8 issue (#528) 2024-01-07 21:06:00 -06:00
David Perez
b7875c2c08 Sends file tab is blocked by premium membership (#527) 2024-01-07 20:57:09 -06:00
David Perez
3361863761 Add UI for saving a send (#526) 2024-01-07 20:30:22 -06:00
David Perez
eda66a7e36 Refactor AddSendViewModel to support loading and error states. (#524) 2024-01-07 20:05:33 -06:00
Brian Yencho
1d85bbc2fc Add SettingsRepository helpers for the current user (#525) 2024-01-07 16:46:12 -06:00
David Perez
5ec912c097 Fix AddSendViewModel name (#522) 2024-01-07 14:06:43 -06:00
Brian Yencho
b74bbbc4f4 Add VaultTimeoutAction handling to SettingsRepository (#521) 2024-01-07 13:31:04 -06:00
Brian Yencho
1fbab32fe7 Add VaultTimeoutAction and handle its persistence (#520) 2024-01-07 13:06:30 -06:00
David Perez
b69a953894 Saves changes to database instead of syncing (#517) 2024-01-07 12:50:55 -06:00
Brian Yencho
e4621b4994 Add SettingsRepository and VaultTimeout (#519) 2024-01-07 12:12:01 -06:00
Brian Yencho
8fb0d1ee8a Add disk storage for Vault Timeout (#518) 2024-01-07 11:21:34 -06:00
David Perez
8e6bda9367 Expose adding/updating sends from vault repo (#516) 2024-01-06 22:14:09 -06:00
David Perez
a6de506267 Add support for encrypting sends (#515) 2024-01-06 21:18:59 -06:00
David Perez
097ce2bb8f Disable network logs in non-debug builds (#514) 2024-01-06 20:44:32 -06:00
Brian Yencho
72597d06ee Ensure the correct file name is used for SharedPreferences (#513) 2024-01-06 16:31:46 -06:00
David Perez
6a52235a2e Add underlyng SendsService to make sends API requests. (#511) 2024-01-06 16:25:54 -06:00
Brian Yencho
45fd9d9f1b Fix Organizations model and persistence format (#512) 2024-01-06 16:24:29 -06:00
David Perez
b1fda8f81d BIT-481: Implement primary Send UI and sharing (#510) 2024-01-06 10:04:49 -06:00
David Perez
d1bbbdedb5 Add support to copy a send url to the clipboard (#508) 2024-01-05 23:10:06 -06:00
Brian Yencho
aa0d574a12 Consolidate Environment(UrlDataJson)Extensions files in data layer (#509) 2024-01-05 18:36:57 -06:00
David Perez
4d06ca8ec0 Update to the latest Bitwarden SDK (v0.4.0) (#507) 2024-01-05 17:04:51 -06:00
Ramsey Smith
62e82dec1f Add select option for title in identity creation (#506) 2024-01-05 15:36:17 -07:00
Ramsey Smith
f5ddb3cba1 Rename tests in VaultAddEditViewModelTest.kt (#505) 2024-01-05 15:35:24 -07:00
David Perez
fd3b7278b4 Replace usages of compose ClipboardManager in UI with BitwardenClipboardManager in ViewModels (#502) 2024-01-05 16:19:56 -06:00
Ramsey Smith
2e212b32d6 BIT-507: Create Card UI (#497) 2024-01-05 14:02:46 -07:00
joshua-livefront
8a865e14c1 Adding DEFAULT_STATE to the GeneratorScreenTests.kt (#504) 2024-01-05 15:18:16 -05:00
David Perez
0d1a553a17 Add the send pending deletion icon (#503) 2024-01-05 12:49:17 -06:00
joshua-livefront
e92440dc1f BIT-1335: Adding plus addressed email generation (#501) 2024-01-05 12:56:19 -05:00
Sean Weiser
6cc0374993 Disable Crashlytic collection for debug builds (#500) 2024-01-05 10:20:53 -06:00
Brian Yencho
ea1c05176f Add the SdkClientManager and use a single Client per user for vault (#499) 2024-01-05 08:57:49 -06:00
Caleb Derosier
49da3972b5 Rename AppearanceAction properties & add dialog tests (#498) 2024-01-04 19:25:29 -07:00
Caleb Derosier
9933335ccb BIT-930: Add UI for Other screen (#477) 2024-01-04 19:24:12 -07:00
David Perez
5eeed09472 Add send icons to row items. (#496) 2024-01-04 20:18:41 -06:00
Caleb Derosier
5efe7864f8 BIT-929: Add UI for Appearance screen (#478) 2024-01-04 13:15:47 -07:00
David Perez
1379c91bfe Reuse the BitwardenListItem and BitwardenGroup items on the Vault (#495) 2024-01-04 13:09:42 -06:00
David Perez
a73e4b3b7a Simplify SettingScreen (#494) 2024-01-04 13:06:52 -06:00
David Perez
2fc19ea6e2 Populate the send screen with real data (#488) 2024-01-04 11:30:50 -06:00
Oleg Semenenko
6751cc2e1e BIT-1101 Adding landscape content and handling scaling better. (#493) 2024-01-04 11:20:28 -06:00
David Perez
3cf7266134 Add sends database table (#490) 2024-01-04 10:20:54 -06:00
joshua-livefront
83007ce1fc Adding default addy io base url for generation calls (#492) 2024-01-04 11:02:49 -05:00
Brian Yencho
5e26a3f920 Make all "...Handlers" classes into data classes (#491) 2024-01-04 09:34:44 -06:00
Brian Yencho
292f95ca66 BIT-842: Fix various paddings and sizes on Vault Screen (#489) 2024-01-03 17:24:06 -06:00
Brian Yencho
abf82ef08f BIT-1247: Restrict password visibility according to permissions (#487) 2024-01-03 17:00:02 -06:00
David Perez
751f112b84 Subscribe to vault SendData (#485) 2024-01-03 14:39:41 -06:00
David Perez
f75aa1fdeb Move the 'isPremiumUser' flag from a common VaultItem property to a Login specific property (#486) 2024-01-03 13:34:11 -06:00
Sean Weiser
f522e63815 Add required permissions to manifest (#484) 2024-01-03 11:13:03 -06:00
David Perez
8ed6bdb5ee Remove test code from VaultViewModel (#483) 2024-01-03 10:18:47 -06:00
Brian Yencho
34f7d9b513 BIT-1246, BIT-1250: Show correct permission-related errors when editing (#482) 2024-01-03 10:15:21 -06:00
David Perez
44b36c9b9e Apply common loading and error UIs (#481) 2024-01-03 09:50:11 -06:00
Brian Yencho
aa2c89f77e Reformat main app and test code (#480) 2024-01-03 09:06:52 -06:00
David Perez
325f0c39da Rename additem to addedit (#474) 2024-01-03 09:06:04 -06:00
Brian Yencho
4ce51cfc8f Use JUnit 5 @AfterEach instead of JUnit 4 @After (#479) 2024-01-03 08:35:31 -06:00
Brian Yencho
7de9f45d81 Use bufferedMutableSharedFlow where appropriate (#476) 2024-01-02 22:08:06 -06:00
Lucas Kivi
74f55ad15f Move autofill classes to pre-existing packages (#475) 2024-01-02 21:15:08 -06:00
Oleg Semenenko
b0f64286d7 BIT-1101, BIT-1066, BIT-1071, BIT-1072 Adding QR code scanning feature (#464) 2024-01-02 17:29:48 -06:00
Oleg Semenenko
1e6c3cd021 BIT-515, BIT-512 Adding the ability to view and edit secure note items. (#462) 2024-01-02 16:39:18 -06:00
Sean Weiser
4beb7dc581 BIT-946: Add Google Services and Crashlytics to standard builds (#473) 2024-01-02 16:31:45 -06:00
David Perez
8cdbab757e Create package for add send feature (#472) 2024-01-02 16:07:41 -06:00
Oleg Semenenko
f793b3d9d3 Making it so we can test the common data easier (#467) 2024-01-02 15:41:04 -06:00
joshua-livefront
b493ffe7f1 BIT-1330, BIT-1331: Implementation to use sdk for forwarded service email generation (#470) 2024-01-02 16:40:39 -05:00
David Perez
2624819282 Add basic UI states to the SendScreen (#471) 2024-01-02 15:30:37 -06:00
Ramsey Smith
bffdaa6ad6 BIT-514: View identity item UI (#461) 2024-01-02 13:09:58 -07:00
renovate[bot]
7f938edc38 Update ruby/setup-ruby action to v1.165.1 (#465)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-02 14:03:36 -06:00
Lucas Kivi
f3be69508f BIT-1293: add autofill service shell (#468) 2024-01-02 19:39:50 +00:00
David Perez
e7830aac4b Add the overflow menu to the send screen (#469) 2024-01-02 13:34:35 -06:00
Brian Yencho
96750bb8c4 Apply formatter to project (#466) 2024-01-02 11:39:03 -06:00
Brian Yencho
2bf05aa6d2 BIT-383: Finish UI for syncing the Vault with the Sync button (#463) 2023-12-29 17:11:56 -06:00
joshua-livefront
b4053c31e4 BIT-713: Adding SimpleLogin service UI (#460) 2023-12-29 16:07:09 -05:00
Brian Yencho
6efca4cfe1 Split up VaultDataExtensions(Test) files (#458) 2023-12-29 14:33:12 -06:00
joshua-livefront
fd1f112293 BIT-712: Adding UI for the FastMail service (#459) 2023-12-29 15:23:11 -05:00
Caleb Derosier
4deeb40b10 BIT-457: Add Vault Settings and Folders screen UI (#457) 2023-12-29 13:11:41 -07:00
joshua-livefront
ef2bdeabca BIT-711: Adding UI for AddyIo service (#456) 2023-12-29 14:16:46 -05:00
Brian Yencho
77006ab281 Make all "...Args" classes into data classes (#455) 2023-12-29 11:53:13 -06:00
Brian Yencho
1bb0d9ecfb Exclude more args from coverage (#454) 2023-12-29 11:17:23 -06:00
Brian Yencho
7f644495b5 Add wrappers for NavGraphBuilder.composable that supply transitions (#453) 2023-12-29 10:21:21 -06:00
Brian Yencho
b5fe7a560f BIT-1244: Implement dynamic vault filtering (#451) 2023-12-29 09:21:43 -06:00
Brian Yencho
3ba6fa4f0f Ensure SplashScreen composable has content to fix intro transition (#452) 2023-12-29 05:50:43 -06:00
Brian Yencho
426dce2961 Ensure toScrolledContainerColor uses the correct easing function (#450) 2023-12-28 18:06:12 -06:00
Brian Yencho
90c9f28e1d BIT-842, BIT-843: Add Vault Filter and Vault Selection menu UI (#448) 2023-12-28 16:33:38 -06:00
joshua-livefront
274cf3e415 BIT-1196: Adding ui for FirefoxRelay service (#449) 2023-12-28 17:26:17 -05:00
Caleb Derosier
2cd698c6b2 BIT-74: Add Login with Device screen (#438) 2023-12-28 21:55:12 +00:00
Ramsey Smith
57f9fbc996 Separate common and type-specific state in VaultItemViewModel (#447) 2023-12-28 15:21:45 -06:00
Sean Weiser
f6ff827698 Omit fdroid debug tests and select the standard flavor by default (#446) 2023-12-28 15:09:04 -06:00
joshua-livefront
f81a430798 BIT-714: Adding ui for duck duck go service type (#445) 2023-12-28 15:51:01 -05:00
Sean Weiser
7f19640996 Add initial product flavors section (BIT-138) (#442) 2023-12-28 13:10:30 -06:00
Brian Yencho
8fc3e62d89 Disable codeowners for workflow files (#444) 2023-12-28 13:01:30 -06:00
joshua-livefront
bfcbf600df Update Bitwarden SDK to 0.3.1-20231221.163756-59 (#443) 2023-12-28 12:43:49 -05:00
Caleb Derosier
95c0acdd3f Disable login button when password is blank (#441) 2023-12-28 10:49:15 -06:00
joshua-livefront
1323a75f22 BIT-871: Adding UI for forwarded email alias (#440) 2023-12-28 11:46:34 -05:00
Caleb Derosier
297fc5319f Replace vertical padding with Spacers on Login & Landing screens (#439) 2023-12-28 10:28:47 -06:00
Caleb Derosier
15a8fa417d BIT-814, BIT-815: Add UI for Enterprise Single Sign On screen (#437) 2023-12-27 16:35:48 -06:00
Ramsey Smith
1ae0b57574 BIT-511: Save identity items (#436) 2023-12-27 15:37:36 -06:00
Ramsey Smith
f0b0c8a0b4 BIT-667: UI for identity creation (Unit Tests) (#435) 2023-12-27 15:15:12 -06:00
Brian Yencho
9eef89f72e Add Organizations to UserState.Account (#432) 2023-12-27 11:30:37 -06:00
Brian Yencho
c7d2048225 Omit current navigation argument classes from code coverage (#434) 2023-12-27 09:46:36 -06:00
Brian Yencho
ff2d60e18a Use consistent naming when adding a single screen to a graph (#433) 2023-12-27 09:05:37 -06:00
Ramsey Smith
2e64b3d501 BIT-667: UI for identity creation (#431) 2023-12-21 13:25:17 -07:00
Brian Yencho
aaf8a8f45f Add clarifying documentation to various StateFlows (#430) 2023-12-21 10:48:32 -06:00
Brian Yencho
f634e0543f Save Organizations data to disk when syncing (#429) 2023-12-21 10:33:48 -06:00
David Perez
feb37ccaf3 VaultData should come directly from the database (#425) 2023-12-21 08:58:22 -06:00
Brian Yencho
32fa075dba Ensure BaseEnumeratedIntSerializer subclasses are not obfuscated (#428) 2023-12-20 17:15:21 -06:00
joshua-livefront
213ba0005b BIT-1259: Fix for Increasing Length Creates a Password in History for Each Adjustment (#427) 2023-12-20 16:17:39 -05:00
Brian Yencho
bdf5abae8e Update various dependencies to latest versions (#426) 2023-12-20 14:18:05 -06:00
Brian Yencho
b931b7367a BIT-1260: Fix line breaks for generated passwords (#424) 2023-12-20 13:01:49 -06:00
Brian Yencho
99107fa4c1 Use monospace font for generated value on Generator Screen (#422) 2023-12-20 10:38:52 -06:00
Brian Yencho
1f1092a325 Add sensitiveInfoSmall/sensitiveInfoMedium fonts (#423) 2023-12-20 10:20:58 -06:00
Brian Yencho
6c15dbc3d0 Update scope to use Unconfined (#421) 2023-12-20 10:06:18 -06:00
David Perez
f801f6fc10 Rename all MutableStateFlows in Vault repo for consistency (#419) 2023-12-19 15:20:25 -06:00
David Perez
0c7a420d16 Fix broken dao fake implementations (#420) 2023-12-19 15:02:16 -06:00
David Perez
33bea2f198 Ensure VaultDiskSource emits when replace operation does not actually change any data (#412) 2023-12-19 14:27:03 -06:00
joshua-livefront
74d456c3d6 BIT-279, BIT-1201: Storage, retrieval, and clearing implementation for password history (#416) 2023-12-19 14:42:47 -05:00
Oleg Semenenko
370ac3df3b BIT-1076 Requesting Camera Permission (#415) 2023-12-19 13:27:35 -06:00
David Perez
ea4825b8b8 Delete the users vault data on logout (#418) 2023-12-19 12:29:34 -06:00
Ramsey Smith
89389e8a9c Refactored VaultAddItem UI State (#417) 2023-12-19 11:08:15 -07:00
Brian Yencho
de38da42b5 Update Bitwarden SDK to 0.3.1-20231219.150921-55 (#409) 2023-12-19 11:47:27 -06:00
David Perez
63ec83f826 BIT-474, BIT-518, BIT-519, BIT-521: Expose flows from the vault database tables (#414) 2023-12-19 11:08:16 -06:00
David Perez
0ff9106ec1 Update getAllCiphers query to be consistent with other queries (#413) 2023-12-19 09:20:42 -06:00
renovate[bot]
7bf6e48356 Update ruby/setup-ruby action to v1.162.0 (#405)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-18 13:10:16 -05:00
Brian Yencho
3afe5b7351 BIT-1229: Use Unconfined dispatcher when collecting flows in AuthRepository (#410) 2023-12-18 11:54:04 -06:00
David Perez
52e10c5b5e Change ZonedDateTimeTypeConverter to class from object (#411) 2023-12-18 11:44:08 -06:00
David Perez
9a27aaa5ad BIT-448: Create collections database table (#408) 2023-12-18 09:55:04 -06:00
Brian Yencho
ba46983444 Add Modifier.scrolledContainerBackground (#407) 2023-12-17 20:33:17 -06:00
Brian Yencho
9d8316321a Remove unused VaultTopBar (#406) 2023-12-17 20:32:42 -06:00
David Perez
0ffa448640 BIT-431: Add a table to the vault database for folders (#403) 2023-12-15 17:59:27 -06:00
David Perez
78c6092334 Update all LocalDateTimes in the app to use ZonedDateTimes (#404) 2023-12-15 17:09:04 -06:00
Brian Yencho
6fe1135dea BIT-1234: Add Account button should appear in switcher on Login (#402) 2023-12-15 13:48:06 -06:00
Oleg Semenenko
91f6e6d105 Adding in tests for the custom type fields (#398) 2023-12-15 12:17:29 -06:00
Brian Yencho
92368b2535 Ensure FAB is hidden for some Vault Screen states (#401) 2023-12-15 12:14:01 -06:00
David Perez
1a3035bb2f Make the sync response profile nonnull (#400) 2023-12-15 11:53:52 -06:00
David Perez
6afa7ba23f BIT-598: Create initial vault database (#399) 2023-12-15 11:21:05 -06:00
Brian Yencho
1428498d41 BIT-379, BIT-381, BIT-384: Add overflow menu to Vault Screen (#397) 2023-12-15 09:21:19 -06:00
Brian Yencho
240e47c161 BIT-406: Allow item listing screen to display Collections data (#394) 2023-12-14 15:38:46 -06:00
David Perez
136d62b41e Add exclusion to LongParameterList lint check for provides methods (#395) 2023-12-14 15:22:33 -06:00
Ramsey Smith
cbc02acf5d Fixed incorrect filtering for folders in VaultItemListingDataExtensions (#396) 2023-12-14 14:12:00 -07:00
David Perez
ec58f57a65 Add helper method for observing a data flow when logged in and someone is subscribed (#392) 2023-12-14 14:08:57 -06:00
Brian Yencho
c34c3dbd1e BIT-1157: Add error state for Vault Screen (#393) 2023-12-14 13:15:55 -06:00
joshua-livefront
3f67f130fa BIT-279: Adding password history data layer (#387) 2023-12-14 12:25:35 -05:00
Brian Yencho
9905b96211 BIT-1158: Add No Network states to Vault Screen (#391) 2023-12-14 10:59:26 -06:00
David Perez
4df89cc01a Add updateToPendingOrLoading helper method (#390) 2023-12-13 18:35:33 -06:00
Ramsey Smith
e702a2105f Fix failing unit tests (#389) 2023-12-13 15:20:49 -07:00
Ramsey Smith
f15ebd7cb8 BIT-1057: Vault item listing functionality (#379) 2023-12-13 14:31:15 -07:00
Ramsey Smith
7aa879d49e Fix incorrect mapping for VaultItemListingType (#388) 2023-12-13 13:49:28 -07:00
Brian Yencho
2f40334e4f BIT-603: Display Collections on Vault screen (#386) 2023-12-13 11:37:52 -06:00
Ramsey Smith
29228c1b21 Rename unit tests for VaultScreenTest and VaultViewModelTest (#385) 2023-12-13 09:47:54 -07:00
David Perez
a46cdc4c26 Update to AGP 8.2.0 (#378) 2023-12-13 10:28:34 -06:00
David Perez
082424f5f2 Simplify add-edit item conversion to CipherView (#384) 2023-12-13 10:08:39 -06:00
Brian Yencho
93b136a879 BIT-874: Expose Collections data from VaultRepository (#382) 2023-12-13 10:00:15 -06:00
Brian Yencho
f3113dc602 Update Compose Material3 and Hilt Navigation versions (#381) 2023-12-13 08:55:20 -06:00
Brian Yencho
26aa60c2af Add zip helpers for Result and use in VaultRepository (#383) 2023-12-13 08:49:56 -06:00
Brian Yencho
c7cd4c22be Filter out Card / Identity types from Add Item type list (#380) 2023-12-12 17:35:43 -06:00
Oleg Semenenko
1c76ed48c5 BIT-529 Added the ability to create custom type fields (#374) 2023-12-12 12:49:44 -06:00
David Perez
50a31095a7 Stop persisting view-item state to SavedStateHandle (#377) 2023-12-12 12:28:55 -06:00
David Perez
9821ffde35 Add getter for Timezone to avoid race condition in tests (#376) 2023-12-12 11:53:25 -06:00
David Perez
c7d01a551f Stop persisting add-edit state to SavedStateHandle (#375) 2023-12-12 11:11:23 -06:00
David Perez
d52114232b BIT-502: Save the updated ciphers from the edit screen (#371) 2023-12-12 10:26:34 -06:00
Brian Yencho
e70e526b93 BIT-1091: Initialize crypto for organizations (#370) 2023-12-12 10:16:41 -06:00
Brian Yencho
e7a7747add Add ability to decrypt Collections (#373) 2023-12-12 09:37:25 -06:00
David Perez
306cf24c99 Remove edit package (#372) 2023-12-12 08:52:51 -06:00
David Perez
e86e36c8e5 BIT-1232: Update password strength colors (#369) 2023-12-11 20:49:05 -06:00
Brian Yencho
25bad1ec78 Store organization keys during sync request (#367) 2023-12-11 20:38:22 -06:00
Brian Yencho
64a3caf354 Ensure user/private key storage is backwards compatible (#368) 2023-12-11 16:06:11 -06:00
Brian Yencho
a42dbf6663 BIT-1135: Add confirmation dialog to lock-or-logout dialog (#364) 2023-12-11 14:57:51 -06:00
Ramsey Smith
ec78532320 Removed padding values from constructors of composable functions (#366) 2023-12-11 13:24:46 -07:00
Brian Yencho
00dcb600a7 BIT-1207: Fully implement account switcher lock and logout (#362) 2023-12-11 13:56:02 -06:00
Ramsey Smith
6844f51faf BIT-956: UI for item listing screen (#356) 2023-12-11 12:39:24 -07:00
David Perez
fe3c6c93e6 Ownership should be common values only displayed when creating a cipher (#365) 2023-12-11 13:24:36 -06:00
Brian Yencho
faa8948712 Standardize naming of actions related to account switcher (#363) 2023-12-11 11:49:32 -06:00
Brian Yencho
a4db8c7a60 Add isActive and isVaultUnlocked to AccountSummary (#361) 2023-12-11 09:29:23 -06:00
Brian Yencho
b7d5de3b6d Add account switcher test helpers (#360) 2023-12-11 09:29:10 -06:00
David Perez
af61909a2b Add ViewState VaultAddItemViewModel (#359) 2023-12-08 16:03:15 -06:00
David Perez
aa7dd81c9c Create common setup method for all VaultAddItemScreen tests (#358) 2023-12-08 13:13:13 -06:00
joshua-livefront
dfc961c64f BIT-618: Auto-enable At Least One Toggle in Password Generation to Prevent Errors (#357) 2023-12-08 14:06:18 -05:00
Oleg Semenenko
25bbe79230 BIT-890 Adding a check for name when we save an item (#355) 2023-12-08 12:50:34 -06:00
David Perez
025271a837 Add API for updating a cipher (#354) 2023-12-08 10:23:11 -06:00
Brian Yencho
c64ca895c4 Bit 1207 add lock and logout to switcher (#353) 2023-12-08 10:22:42 -06:00
joshua-livefront
fba2a5857c BIT-710: Implement Password History UI (#352) 2023-12-08 10:12:23 -05:00
David Perez
3c74d33aae Add new navigation for the edit item screen (#350) 2023-12-07 15:52:10 -06:00
Brian Yencho
6ef2566618 Add environment data to UserState.Account and AccountSummary (#351) 2023-12-07 15:01:17 -06:00
Brian Yencho
611d8f5711 Update definition of Environment.label (#349) 2023-12-07 14:35:08 -06:00
Oleg Semenenko
6498ab2ffb BIT-509: Adding the Ability to Save a SecureNote Item (#347) 2023-12-07 14:03:20 -06:00
Ramsey Smith
deaf83e81d Corrected size of ic_settings.xml (#348) 2023-12-07 10:39:52 -07:00
Ramsey Smith
3d53be68c9 BIT-965: Navigation for vault item listing screen (#336) 2023-12-07 09:04:20 -07:00
Oleg Semenenko
5d200b36ff Changing Add Login Type methods to be more specific, and changing some values to be Text instead of Strings. (#346) 2023-12-07 09:54:57 -06:00
David Perez
00e9540d51 Migrate VaultAddItemScreen to use a LazyColumn (#345) 2023-12-07 09:17:22 -06:00
Brian Yencho
08900b6838 BIT-1017: Add "Account already added" dialog to Landing Screen (#344) 2023-12-07 09:14:03 -06:00
Brian Yencho
89dfa8dbb7 Use a DialogState in LandingState (#341) 2023-12-06 17:25:51 -06:00
Ramsey Smith
a3065e6686 Update SyncResponseJson.kt (providerType) (#343) 2023-12-06 16:21:20 -07:00
David Perez
06909a3146 Add helper method for applying visual transformations to any string (#342) 2023-12-06 16:46:04 -06:00
David Perez
166b0df203 BIT-1018: Add visual transformation to generated string field (#340) 2023-12-06 16:22:27 -06:00
David Perez
b1c3a2de87 Add visual transformation for password character colors (#337) 2023-12-06 15:36:42 -06:00
Brian Yencho
82ee31336e Add divider between all account switcher items (#339) 2023-12-06 15:25:54 -06:00
David Perez
fbf5fb7550 Allow BitwardenTwoButtonDialog to have no title (#338) 2023-12-06 14:48:39 -06:00
David Perez
aee95bf572 Use Glide Compose library instead of the non-compose library (#334) 2023-12-06 14:47:02 -06:00
Ramsey Smith
b1068bd933 Fix sync response for send object (#335) 2023-12-06 13:12:07 -07:00
Brian Yencho
fc90a84353 BIT-732: Add account swither to login screen (#333) 2023-12-06 11:37:29 -06:00
David Perez
16ef9f7732 Add VaultItemView tests (#315) 2023-12-06 10:24:20 -06:00
Brian Yencho
1b5a62fd3b Reorganize LoginScreen (#331) 2023-12-06 10:05:54 -06:00
Brian Yencho
98979e516b BIT-853: Updated email when switching account on Vault Unlock screen (#332) 2023-12-06 10:00:52 -06:00
David Perez
13e5ef547d Add navigation routing for the VaultEditItemScreen (#328) 2023-12-06 09:35:36 -06:00
Brian Yencho
0682f37991 Simplify LoginScreen / LoginViewModel tests (#330) 2023-12-06 09:23:09 -06:00
David Perez
a0e88211ef Apply formatter to entire repo (#329) 2023-12-05 19:54:12 -06:00
Brian Yencho
819694b135 BIT-467: Implement Lock Now functionality (#327) 2023-12-05 16:41:55 -06:00
David Perez
ee260c6697 Adds the initial boilerplate for VaultEditItemScreen (#326) 2023-12-05 16:14:31 -06:00
Brian Yencho
c3cb09b156 BIT-1133: Add account switcher to Landing Screen (#323) 2023-12-05 15:35:27 -06:00
Oleg Semenenko
d4d79bae01 BIT-666: Create UI for Secure Note-type item creation (#319) 2023-12-05 12:16:26 -06:00
David Perez
55e0f5f39c Update toolbar action colors (#325) 2023-12-05 11:37:35 -06:00
David Perez
322220bf36 Format GeneratorSdkSourceTest (#324) 2023-12-05 10:46:15 -06:00
David Perez
ffd655c3df Update to the latest version of the SDK (#320) 2023-12-05 10:15:38 -06:00
Brian Yencho
43b7056958 Add BitwardenScaffold to LandingScreen (#321) 2023-12-05 10:00:37 -06:00
Brian Yencho
8bb0df863c Clean up LandingScreen tests (#322) 2023-12-05 09:53:00 -06:00
Ramsey Smith
98bc4f1bd6 Update package name for CipherJsonRequest (#317) 2023-12-05 08:29:27 -07:00
renovate[bot]
ed4877b188 Update actions/setup-java action to v4 (#311)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 09:58:58 -05:00
Brian Yencho
05e056fdbe BIT-853: Implement account switching (#316) 2023-12-04 18:40:57 -06:00
Brian Yencho
93764acc2d Add OmitFromCoverage annotation to exclude special cases (#318) 2023-12-04 18:40:37 -06:00
joshua-livefront
370ebccb73 BitwardenMultiSelectButton options update to use ImmutableList (#314) 2023-12-04 15:12:49 -05:00
joshua-livefront
633bd443cc BIT-662: Adding UI for random word generator (#313) 2023-12-04 13:21:16 -05:00
Brian Yencho
c8d5f1633a BIT-1204: Use WCAG 1.0 values when determining overlay colors (#309) 2023-12-04 11:25:08 -06:00
Brian Yencho
5fd0c47d92 BIT-1151: Enforce maximum account limit in account switcher (#310) 2023-12-04 10:26:28 -06:00
David Perez
4360f20638 BIT-500 Add View Item Screen (#299) 2023-12-04 10:12:42 -06:00
David Perez
6bd2604719 Update the Bitwarden SDK (#312) 2023-12-04 09:46:58 -06:00
Brian Yencho
fef9d1fa5f BIT-1215: Improve handling of avatar initials for missing names (#308) 2023-12-02 13:03:33 -06:00
joshua-livefront
1df7726acc Adding the tooltip icon to the UsernameType dropdown in the generator (#307) 2023-11-30 17:59:32 -05:00
David Perez
2e2d4de0d7 Expose the HaveIBeenPwned service via auth repo (#306) 2023-11-30 15:19:47 -06:00
Brian Yencho
193ecd1495 BIT-1110: Allow account addition via the account switcher (#305) 2023-11-30 14:03:46 -06:00
David Perez
004240badc Add support for zero-width space (#304) 2023-11-30 11:07:34 -06:00
joshua-livefront
8d495bf21a BIT-660: Adding ui for catch all email (#303) 2023-11-30 11:51:59 -05:00
Brian Yencho
6958076442 Use delegation for rememberedEmailAddress (#302) 2023-11-30 10:23:52 -06:00
Ramsey Smith
039f5e78ea BIT-1205: Save login items (Encryption) (#295) 2023-11-30 08:50:10 -07:00
David Perez
ff9ea721d9 BIT-685: Add request headers to all network requests in the app (#300) 2023-11-30 09:49:55 -06:00
David Perez
46eb18d0a5 Replace the generic Result class in the auth repo with specific result classes (#301) 2023-11-30 09:00:32 -06:00
Brian Yencho
083c431262 BIT-325: Create and persist device identifier (#298)
Co-authored-by: Oleg Semenenko <oleg@livefront.com>
2023-11-29 16:59:06 -06:00
joshua-livefront
43393a3608 Adding remember viewmodel to our handlers in the Generator (#297) 2023-11-29 17:18:14 -05:00
joshua-livefront
58d05f6331 Readability improvements for GeneratorScreen.kt (#296) 2023-11-29 14:51:17 -05:00
David Perez
636b38b6a0 Add BitwardenPasswordFieldWithActions with manual password visibility (#294) 2023-11-29 11:39:32 -06:00
joshua-livefront
37f2355a56 BIT-659: Adding UI for plus addressed email generator (#293) 2023-11-29 12:28:55 -05:00
David Perez
5bc936198d Add support for leading icons and multi-line text fields (#292) 2023-11-29 09:54:30 -06:00
Brian Yencho
ed1b2405c0 Listen to UserState changes on the Vault Unlock screen (#290) 2023-11-29 08:12:43 -06:00
joshua-livefront
eb93fb058e Update generator item spacing, remove vertical arrangement (#291) 2023-11-28 18:48:00 -05:00
David Perez
9c00d19816 Minor updates to prepare for View Item screen (#289) 2023-11-28 15:09:37 -06:00
Ramsey Smith
6fbf109df5 Corrected directories within vault package (#287) 2023-11-28 12:54:37 -07:00
Brian Yencho
83420f2c39 Lock vault and clear data when logging out (#288) 2023-11-28 13:28:23 -06:00
Vince Grassia
ab8656a132 Pin gh-actions to main (#286) 2023-11-28 10:58:32 -05:00
Brian Yencho
8a951fbae6 BIT-1081: Add log out ability to Vault Unlock screen (#285) 2023-11-28 09:13:16 -06:00
Brian Yencho
2a1310cf3e Update overflow menu popup handling and styling (#283) 2023-11-27 21:17:33 -06:00
David Perez
8839428397 Set null composable when content is empty (#284) 2023-11-27 20:45:59 -06:00
David Perez
ece4ccc565 Update Basic dialog to allow for empty message or an empty title (#282) 2023-11-27 15:42:22 -06:00
Brian Yencho
b6999d7b07 BIT-1191: Calculate avatar color when absent (#280) 2023-11-27 15:10:54 -06:00
David Perez
f3bcab42f3 Add 'Have I Been Pwnd' method that returns a breach count (#281) 2023-11-27 15:10:41 -06:00
joshua-livefront
a59a2f5ddb BIT-534: fixing trash counter to always display one (#279) 2023-11-27 15:25:33 -05:00
David Perez
833dfd501d BIT-1197 Add token refresh handling (#274) 2023-11-27 13:40:45 -06:00
David Perez
1729eb42c2 Add 'isPremium' boolean to account info (#278) 2023-11-27 12:20:30 -06:00
joshua-livefront
1c0635e7c8 BIT-653: Adding passphrase generation implementation (#277) 2023-11-27 12:58:21 -05:00
David Perez
79af4a8c0c Update the Bitwarden SDK (#276) 2023-11-27 09:56:53 -06:00
Ramsey Smith
74ea7373ba BIT-1078: Save login items (Networking) (#272) 2023-11-22 21:13:05 -07:00
joshua-livefront
fa93d4cc6b BIT-653: Adding data source for passphrase generation (#273) 2023-11-22 18:22:56 -05:00
David Perez
ddc7b0b713 Add synchronous refresh token API (#271) 2023-11-22 15:52:25 -06:00
Brian Yencho
1c2413d4dc BIT-1204: Improve avatar color visiblity (#270) 2023-11-22 09:40:21 -06:00
David Perez
69bccf469f Add view item navigation (#269) 2023-11-21 14:23:44 -06:00
Brian Yencho
1652c8cc58 Optimize the account switcher background color updating (#268) 2023-11-21 13:16:36 -06:00
Brian Yencho
ee322ef444 BIT-1082: Implement vault unlock functionality (#263) 2023-11-21 12:06:15 -06:00
David Perez
3b0532f7fd Minor updates to the text fields (#266) 2023-11-21 11:48:37 -06:00
joshua-livefront
82910e17ea Generator loadPasscodeOptions to include setting defaults (#267) 2023-11-21 12:31:55 -05:00
David Perez
3e9c0a0fd1 Decouple unlock and sync (#264) 2023-11-21 11:17:46 -06:00
Brian Yencho
cc637bcabc Update UserStateJson with avatarColor and securityStamp from sync (#265) 2023-11-21 09:19:47 -06:00
joshua-livefront
7e4dc10b1b Removing unnecessary event flows from generator viewmodel tests (#262) 2023-11-20 14:39:29 -05:00
Brian Yencho
7e1fb14f1c Save the current environment to UserStateJson when logging in (#260) 2023-11-20 12:47:34 -06:00
Brian Yencho
fc71717df5 Simplify BaseDiskSource usage (#261) 2023-11-20 11:49:36 -06:00
Brian Yencho
dcaffe9b03 Move AccountSumary to ui package and make name nullable (#259) 2023-11-20 11:37:26 -06:00
David Perez
afe4f5ed55 Add vault repo methods for getting vault items by ID (#256) 2023-11-20 11:34:05 -06:00
joshua-livefront
f8a76380bb BIT-654: App should generate passwords (#258) 2023-11-20 11:47:01 -05:00
renovate[bot]
7e339fe38b Update ruby/setup-ruby action to v1.161.0 (#240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 10:10:11 -05:00
David Perez
ba4d1e2f9a Add helper property for retrieving current VM state (#257) 2023-11-17 16:28:15 -06:00
Brian Yencho
acdc9d2a47 Update Bitwarden SDK to 0.3.1-20231116.203646-8 (#255) 2023-11-17 14:19:25 -06:00
Ramsey Smith
6851c1169b BIT-1117: Decrypt sends (#254) 2023-11-17 12:52:56 -07:00
David Perez
c8586542c1 BIT-1111: Add delete account logic (#252) 2023-11-17 11:11:35 -06:00
David Perez
6cce047c2a Create initial vault item shell (#253) 2023-11-16 18:00:14 -06:00
David Perez
320f3cc6ed Remove hangs (#251) 2023-11-16 09:17:55 -06:00
David Perez
2938419461 BIT-1160: Add test tags to the login screen (#250) 2023-11-15 17:13:25 -06:00
David Perez
5d7da7576e Create a helper for testing with suspending functions that need to hang for the tests (#249) 2023-11-15 15:57:59 -06:00
Ramsey Smith
f997ccfead BIT-205: Populate vault with login items (#246) 2023-11-15 14:15:04 -07:00
David Perez
b0ea7a4229 Add IME padding to create account screen (#248) 2023-11-15 08:47:19 -06:00
joshua-livefront
0488e0bc12 BIT-654: Moving Generator data to the tools package (#247) 2023-11-14 16:57:00 -05:00
joshua-livefront
7b22632c49 BIT-654: Adding generator disk source implementation (#245) 2023-11-14 15:07:48 -05:00
David Perez
c7acbebed3 Add one hour option to new send choosers (#244) 2023-11-14 10:34:08 -06:00
David Perez
9ab51d5044 BIT-999: Add UI for Vault Unlock screen (#243) 2023-11-14 08:53:05 -06:00
David Perez
baff04c1c5 Update button colors to adhere to material style (#242) 2023-11-13 14:45:58 -06:00
David Perez
345aa4800d BIT-1031: Add shell for the delete account UI (#241) 2023-11-13 13:17:16 -06:00
renovate[bot]
fb48dd0ef2 Update bitwarden/gh-actions digest to ebb1eb8 (#239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-13 09:49:07 -07:00
Brian Yencho
5d8b3fb972 Ensure no-op test of account switching is valid (#238) 2023-11-13 10:41:02 -06:00
David Perez
07c0e8ae83 Rename VaultScreen to VaultSettingsScreen (#237) 2023-11-10 15:58:34 -06:00
David Perez
ba4401cee9 BIT-479: Fix minor New Send bugs (#236) 2023-11-10 15:02:36 -06:00
Brian Yencho
830112c070 BIT-852: Add account switcher UI (#235) 2023-11-10 11:54:30 -06:00
Ramsey Smith
b9d60e8a04 BIT-1128: Expose vault data (#227) 2023-11-09 16:16:06 -07:00
David Perez
22e30b5eac Fix folders header typo (#234) 2023-11-09 16:32:50 -06:00
joshua-livefront
aa2fd560ce BIT-654: Generator SDK interface and repository implementation (#233) 2023-11-09 17:08:37 -05:00
David Perez
ab06123905 Update the 'BitwardenTopAppBar' to make the navigation icon optional (#232) 2023-11-09 15:56:57 -06:00
David Perez
d388a520bd BIT-927: Add missing 'Host' URI detection type (#231) 2023-11-09 14:41:57 -06:00
David Perez
425b9085bd BIT-470: Add missing colon for fingerprint phrase dialog (#230) 2023-11-09 14:39:26 -06:00
David Perez
290def1e60 BIT-974, BIT-978: Add confirmation dialogs when launching an external link. (#229) 2023-11-09 09:42:18 -06:00
David Perez
fdc77ae0ee Add additional test coverage for vault screen (#228) 2023-11-08 17:20:35 -06:00
Andrew Haisting
1b573b7f72 Add BitwardenStepper component (#226) 2023-11-08 12:12:17 -06:00
David Perez
eb0e04c824 Fix minor TalkBack issues in VaultScreen (#225) 2023-11-08 11:59:24 -06:00
joshua-livefront
a8372b354d BIT-534: Adding UI and tests for the the vault list screen (#216) 2023-11-08 10:48:38 -06:00
Brian Yencho
197627e3de Remove unnecessary ) from some links (#224) 2023-11-08 09:31:17 -06:00
Brian Yencho
0fd4f7914d Add Kotlin immutable collections dependency (#223) 2023-11-08 09:20:42 -06:00
David Perez
e9cedeede1 Add BitwardenScaffold to handle commonly overridden values. (#214) 2023-11-07 15:51:00 -06:00
David Perez
3af14cd674 Update the VaultAddItemScreen spacing between items (#222) 2023-11-07 15:28:24 -06:00
Brian Yencho
8e09629729 Update Android Gradle Plugin to 8.1.3 (#220) 2023-11-07 14:01:20 -06:00
Andrew Haisting
592f5f25d7 Add AnimatedVisibility for new send options section (#221) 2023-11-07 14:00:15 -06:00
Andrew Haisting
ab29977353 Re-organize String extensions to correct packages and update test name (#219) 2023-11-07 11:53:26 -06:00
Andrew Haisting
d45322a7b3 BIT-479 Implement new send UI (#215) 2023-11-07 11:19:30 -06:00
Ramsey Smith
d19ff58009 BIT-990: Initialize Crypto for Vault (#213) 2023-11-07 09:17:32 -07:00
David Perez
c92413b91c Remove unnecessary backgrounds to reduce overdraw. (#218) 2023-11-07 10:04:33 -06:00
David Perez
367d2ed391 BIT-1108: Add test tags to create account UI (#217) 2023-11-07 09:54:10 -06:00
David Perez
a9068b6937 BIT-927: Add auto-fill UI (#208) 2023-11-06 16:00:28 -06:00
Brian Yencho
d5879f1cd4 BIT-817, BIT-991: Add self-hosted/custom environment functionality (#209) 2023-11-06 15:46:23 -06:00
Brian Yencho
236c62cdd3 Replace custom Text usage in shared components with String (#212) 2023-11-06 12:48:00 -06:00
David Perez
1593add099 Handle window insets on the Environment screen. (#211) 2023-11-06 11:17:35 -06:00
Andrew Haisting
f7b8bab78d Fix broken test (#210) 2023-11-06 09:58:08 -06:00
Andrew Haisting
6e3fbc2217 BIT-920 Implement send screen empty state UI (#191) 2023-11-06 09:03:02 -06:00
joshua-livefront
dbb85d4477 Update all instances of Add Item to Add item (#207) 2023-11-03 15:54:34 -04:00
Brian Yencho
135c9bdee8 Update all stable dependencies to latest versions (#206) 2023-11-03 12:27:39 -05:00
Brian Yencho
a682d06fbe Pin Bitwarden SDK to 0.3.1-20231103.145900-2 (#205) 2023-11-03 11:54:02 -05:00
Brian Yencho
4244032add BIT-817: Update storage of Environment on Landing Screen (#203) 2023-11-03 11:09:11 -05:00
David Perez
b22cc97963 Update push animations to match the spec (#199) 2023-11-03 09:49:33 -05:00
David Perez
2f44155ae3 BIT-470: Add support for fingerprint phrase dialog (#196) 2023-11-03 09:41:38 -05:00
Brian Yencho
e61a4b7e0e Add optional "hint" to BitwardenTextField and BitwardenPasswordField (#202) 2023-11-03 09:35:15 -05:00
Brian Yencho
92582ee304 Unpin the SDK version and use SNAPSHOT (#204) 2023-11-03 09:15:51 -05:00
Ramsey Smith
c621220e97 Added key to sync response model and cipher sdk object (#201) 2023-11-02 15:44:11 -06:00
Brian Yencho
56d8e83849 Pin Bitwarden SDK to 0.3.1-20231102.172014-25 (#200) 2023-11-02 15:15:26 -05:00
renovate[bot]
9aefc1eac9 Update bitwarden/gh-actions digest to ba6a775 (#175)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-02 13:45:18 -04:00
renovate[bot]
0ebeccea31 Update ruby/setup-ruby action to v1.159.0 (#176)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-02 13:45:03 -04:00
Ramsey Smith
8310c63a39 BIT-1033: Store user key and private key to disc (#197) 2023-11-02 10:41:21 -06:00
David Perez
3a3247bff0 Update TextStyles to not trim off LineHeight. (#198) 2023-11-02 11:25:02 -05:00
David Perez
12c3be514f BIT-926: account security UI (#193) 2023-11-01 20:06:22 -05:00
David Perez
b4fcbff695 Tweak BitwardenListHeaderText and BitwardenWideSwitch to follow patterns. (#195) 2023-11-01 16:14:54 -05:00
joshua-livefront
e06e36b1be BIT-534: Bitwarden shared composables and icons for my vault list screen (#192) 2023-11-01 16:36:09 -04:00
Andrew Haisting
d3b92dd0e7 Remove "View" suffix from vault composables (#194) 2023-11-01 12:54:22 -05:00
Brian Yencho
0ff78663cf Update Compose Material 3 to 1.2.0-alpha10 (#190) 2023-11-01 08:54:23 -05:00
David Perez
05fa7ce843 Add reusable BitwardenTextRow (#185) 2023-10-31 13:49:19 -05:00
Brian Yencho
d7db76324b Treat transition types using separate durations (#189) 2023-10-31 11:43:20 -05:00
Andrew Haisting
b9a4a6714e BIT-994 Use dialogs instead of dropdowns on generator (#188) 2023-10-31 11:27:04 -05:00
Brian Yencho
5e36e6a7d1 Tweak exit "stay" transition to eliminate most of fade (#187) 2023-10-31 11:13:15 -05:00
Brian Yencho
d14fe9b647 BIT-330: Implement self-hosting/custom environment UI (#184) 2023-10-31 11:12:01 -05:00
Andrew Haisting
9dca3fb38f BIT-707 Update copy on password strength indicator (#186) 2023-10-31 10:53:01 -05:00
joshua-livefront
e0838cf4a4 BIT-665: Create Add UI for Login-type item (#179) 2023-10-31 11:47:11 -04:00
David Perez
72c454768d Add wrapper for dispatchers (#183) 2023-10-31 10:02:00 -05:00
Ramsey Smith
10a20f626d BIT-897 Decrypt sync response (#181) 2023-10-31 08:06:36 -06:00
David Perez
d0dacfb4ed Add basic push transitions (#182) 2023-10-31 08:31:36 -05:00
Andrew Haisting
6504842348 BIT-989 Show region selector as dialog (#180) 2023-10-31 07:42:31 -05:00
David Perez
e3da307faa BIT-931: Fill out about UI (#178) 2023-10-30 15:47:54 -05:00
Brian Yencho
fd5bbe00d5 BIT-985: Add initial transitions to the auth flow (#174) 2023-10-30 11:07:07 -05:00
Andrew Haisting
6fb630ba29 BIT-471 Show confirm log out dialog (#173) 2023-10-30 10:35:19 -05:00
Andrew Haisting
ebb8632152 BIT-986 Add email input types to login and create account (#177) 2023-10-30 10:24:05 -05:00
Brian Yencho
59318d8a66 Rename NetworkConfigRepository to NetworkConfigManager (#172) 2023-10-27 13:01:00 -05:00
Brian Yencho
75c8bb2920 BIT-970: Ensure Terms of Service switch reads off checked state (#171) 2023-10-27 11:27:03 -05:00
David Perez
6b78f7b1a9 Settings boilerplate (#170) 2023-10-27 10:30:21 -05:00
David Perez
8be69e6442 Replace Kotlin assertions with JUnit assertions. (#168) 2023-10-26 16:57:59 -05:00
David Perez
8ab1c54149 Update string resources. (#169) 2023-10-26 16:18:35 -05:00
Andrew Haisting
a2655f6e74 BIT-707 Implement password strength indicator with mock values (#161) 2023-10-26 15:39:25 -05:00
Ramsey Smith
4cd4110e89 Renamed modules to be package specific (#166) 2023-10-26 13:07:47 -06:00
Andrew Haisting
4c866e62f2 Remove references to HTTP constants in favor of raw ints (#167) 2023-10-26 13:48:16 -05:00
Andrew Haisting
6fa75ac818 BIT-910 Parse server error messages on create account request (#164) 2023-10-26 13:29:30 -05:00
David Perez
adc02e4cef Simplify the BaseTheme and remove the night styles.xml. (#165) 2023-10-26 09:06:31 -05:00
David Perez
e7add955ea BIT-957: Add color change animation for toolbars. (#163) 2023-10-25 17:05:50 -05:00
David Perez
0fd2edc30e BIT-955: Add edge-to-edge support (#162) 2023-10-25 16:32:40 -05:00
Brian Yencho
95d7eaf144 BIT-725, BIT-328: Add base URL interceptors and dynamically change environments (#160) 2023-10-25 14:24:02 -05:00
Brian Yencho
62fe0ea901 BIT-150: Add more comprehensive list of settings rows. (#155)
Co-authored-by: David Perez <david@livefront.com>
2023-10-25 09:59:49 -05:00
Andrew Haisting
f9df52b253 BIT-189 Check data breaches toggle should default to on (#159) 2023-10-25 09:36:07 -05:00
Andrew Haisting
0b3923a49b BIT-945 Continue with registration if HIBP call fails (#158) 2023-10-24 16:23:16 -05:00
joshua-livefront
af5dc1f163 BIT-904: Fixing color of add an item button while in dark them (#157) 2023-10-24 16:36:51 -04:00
joshua-livefront
9983cd72a2 Refactor BitwardenOverflowTopAppBar for better re-use (#156) 2023-10-24 15:54:11 -04:00
Andrew Haisting
fa4cd603b4 BIT-189 Check for data breaches during create account (#154) 2023-10-24 11:36:11 -05:00
Brian Yencho
4d93147186 BIT-725: Replace "region" concept with Environment (#152) 2023-10-24 11:17:10 -05:00
Brian Yencho
689cc2be27 BIT-752: Add Environment/EnvironmentRepository/EnvironmentDiskSource (#151) 2023-10-24 10:46:33 -05:00
Brian Yencho
6b62cc7b7a BIT-411: Add NetworkConfigRepository (#150) 2023-10-24 09:49:22 -05:00
Brian Yencho
8ecd1c0261 Update the formatting of non-resource files (#153) 2023-10-24 09:11:07 -05:00
Brian Yencho
de2d9bc4c1 BIT-933: Properly pass nullable captcha to login screen (#149) 2023-10-23 16:54:42 -05:00
Brian Yencho
8644d39bcc BIT-925: Fix Proguard issues when there is no network (#148) 2023-10-23 15:21:30 -05:00
Andrew Haisting
49d155a627 BIT-925 Turn off r8 full mode to prevent crash when creating account (#147) 2023-10-23 13:56:31 -05:00
Brian Yencho
f3d7fde1ef Fix crash when parsing JWT and 'name' property is not present in the … (#146)
Co-authored-by: David Perez <david@livefront.com>
2023-10-23 13:44:55 -05:00
joshua-livefront
ec64e15f8d BIT-904: Reskin for the first time user vault screen (#144) 2023-10-23 14:25:18 -04:00
Ramsey Smith
21424f52dd BIT-636: Rectify sync api response model (#145) 2023-10-23 12:01:50 -06:00
Andrew Haisting
98c09e5bf4 Clean up CreateAccountViewModelTest (#142) 2023-10-23 10:29:03 -05:00
Brian Yencho
906980497f BIT-698: Add landing email validation (#143) 2023-10-23 10:10:58 -05:00
renovate[bot]
e0025ac3d5 Update gh minor (#139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 09:30:29 -04:00
Brian Yencho
2b491facdc Clean up landing screen test (#141) 2023-10-23 08:10:44 -05:00
Brian Yencho
96142cda5d Improve switch toggle semantics (#140) 2023-10-23 06:32:14 -05:00
Brian Yencho
3ec772447b BIT-765: Add access token storage (#138) 2023-10-20 14:46:01 -05:00
Andrew Haisting
26d2687dba Create account validations (#137) 2023-10-20 12:24:02 -05:00
Ramsey Smith
77166d7008 BIT-102: Create account functionality (#132) 2023-10-19 09:00:39 -06:00
Andrew Haisting
a5581a093e Rename other navigation extensions per new naming convention (#134) 2023-10-19 09:33:16 -05:00
Brian Yencho
329c310d58 BIT-765: Add additional properties to GetTokenResponseJson.Success (#136) 2023-10-19 09:09:21 -05:00
Brian Yencho
3d9841080a Add newlines between annotated properties (#135) 2023-10-18 17:10:07 -05:00
Andrew Haisting
31ee345ce1 Use nested navigation for Account settings (#133) 2023-10-18 16:40:33 -05:00
Brian Yencho
cbea25db78 Add KdfTypeJson and associated BaseEnumeratedIntSerializer (#131) 2023-10-18 15:05:33 -05:00
Andrew Haisting
89e980ac59 BIT-896 Allow user to log out (#129) 2023-10-18 13:55:46 -05:00
joshua-livefront
36451a7bda BIT-900: Adding state for each of the possible username state selections (#130) 2023-10-18 14:54:11 -04:00
Andrew Haisting
8ae3f365b7 BIT-868 Keep password fields on create account in sync (#125) 2023-10-18 13:29:48 -05:00
renovate[bot]
837b7b5c5b Update bitwarden/gh-actions digest to c970b0f (#100)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-18 12:21:36 -04:00
joshua-livefront
41b870e1d5 Updating generator tests formatting (#128) 2023-10-18 10:53:14 -04:00
Brian Yencho
c28d48d2eb BIT-765: Parse user information from JWT token (#127) 2023-10-18 09:21:45 -05:00
joshua-livefront
05ee70827e BIT-634: Generator UI fixes (#126) 2023-10-17 16:47:07 -04:00
Andrew Haisting
e634390612 BIT-886 Update text color on environment switcher (#122) 2023-10-17 10:21:11 -05:00
Andrew Haisting
82b7417730 Add table template to screenshot section of PR template (#124) 2023-10-17 10:12:06 -05:00
Oscar Hinton
c1191196f5 Disable CODEOWNERS (#121) 2023-10-17 17:07:07 +02:00
Andrew Haisting
916d6aa7a5 BIT-885 Use correct string resource on LoginScreen (#123) 2023-10-17 10:02:32 -05:00
joshua-livefront
69009c3d6f BIT-870: Updating the BitwardenWideSwitch ripple (#119) 2023-10-17 10:27:06 -04:00
Brian Yencho
7a98dfb6c2 Add BaseSurrogateSerializer (#120) 2023-10-17 09:18:27 -05:00
Brian Yencho
1f197b4796 Add AuthSdkSource (#118) 2023-10-16 13:52:18 -05:00
Brian Yencho
c7794f0ca4 BIT-755: Add Kover and Danger for code coverage (#103) 2023-10-16 10:12:39 -05:00
Brian Yencho
92a9f49ca6 BIT-858: Update LandingScreen paddings to accommodate updated switch element (#116) 2023-10-16 09:39:29 -05:00
Andrew Haisting
098c576d1a BIT-326 Use correct value for deviceName on get token request (#114) 2023-10-16 09:35:44 -05:00
Brian Yencho
68f37d8e85 Update Bitwarden SDK version to 0.3.1-SNAPSHOT (#117) 2023-10-16 07:48:21 -05:00
Andrew Haisting
da6b40bc48 BIT-329 Implement parsing and usage of kdf params (#112) 2023-10-13 14:05:55 -05:00
joshua-livefront
cbcb354a48 BIT-867: Refactor generator screen lambdas (#115) 2023-10-13 13:35:53 -04:00
Andrew Haisting
8e2dc9796f Remove unused constant from AuthRepositoryImpl (#113) 2023-10-13 10:53:32 -05:00
Brian Yencho
c187ee3bf3 BIT-866: Update dev launcher icon and add QA icon for CI usage (#111) 2023-10-13 09:52:49 -05:00
Brian Yencho
fb1a5552eb BIT-859: Add automated test IDs to LandingScreen (#110) 2023-10-12 16:48:56 -05:00
joshua-livefront
86b44a802a BIT-634: Create Password Generation UI (#109) 2023-10-12 14:41:58 -04:00
Andrew Haisting
2babd278c2 BIT-188 Add switches and links for check password and terms and privacy (#106) 2023-10-12 11:39:09 -05:00
Brian Yencho
7fd1052565 Update version name to 1.0.0 (#108) 2023-10-12 11:22:52 -05:00
Brian Yencho
e6215bcee2 Remove extra provideOkHttpClient call (#107) 2023-10-12 10:27:07 -05:00
Ramsey Smith
224fc9a2f4 BIT-764: Chrome Custom Tabs for hcpatcha verification (#105) 2023-10-11 09:37:03 -06:00
Andrew Haisting
56a8674958 BIT-543: Add Remember Me functionality to Landing Screen (#104)
Co-authored-by: Brian Yencho <brian@livefront.com>
2023-10-10 13:22:41 -05:00
Ramsey Smith
ff77c96767 BIT-320: Loading and error dialogs (#101) 2023-10-10 08:04:59 -06:00
joshua-livefront
1ed964a072 BIT-635: Adding updated UI for Passphrase Generator screen (#102) 2023-10-09 16:05:36 -04:00
Andrew Haisting
0b3fb4d467 BIT-754 Add singleLine = true to text field components (#99) 2023-10-06 13:48:58 -05:00
Andrew Haisting
a785ab0ba7 BIT-753 Remove mention of "retrofit" from service level docs (#98) 2023-10-06 13:48:31 -05:00
Andrew Haisting
179b7bb956 BIT-751 Remove submit button at bottom of create account (#97) 2023-10-06 11:15:36 -05:00
Andrew Haisting
9a3420894b BIT-193 Implement password length validation on create account (#96) 2023-10-05 17:23:04 -05:00
renovate[bot]
1d777f77ce Update bitwarden/gh-actions digest to f112580 (#77)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-05 14:57:22 -04:00
joshua-livefront
1515e428fd BIT-730: Refactor Generator Screen Navigation (#94) 2023-10-04 13:51:49 -05:00
Andrew Haisting
e1ecebe0a3 BIT-181 Implement Text interface for passing strings and resources to UI (#95) 2023-10-04 13:26:41 -05:00
Ramsey Smith
943ecd5d16 BIT-726: Stub loading and errors for logging in (#93) 2023-10-03 17:29:49 -05:00
Andrew Haisting
2187737fde BIT-556 BIT-190 Update current CreateAccountScreen to match designs (#92) 2023-10-03 16:39:59 -05:00
joshua-livefront
4e6974deb4 BIT-202: Adding region selector composable to Landing Screen (#91) 2023-10-03 16:37:36 -05:00
Brian Yencho
4f93c3f85e BIT-553: Apply design reskin on current LoginScreen (#90) 2023-10-03 15:44:58 -05:00
Andrew Haisting
ab891bd733 BIT-723 Use 0 for device type (#84) 2023-10-03 15:11:49 -05:00
joshua-livefront
f7328fe2f9 BIT-722: Adding generator navigation to the nav bar (#83) 2023-10-03 15:55:27 -04:00
Brian Yencho
a736daf3e5 Explicitly navigate back from login screen when clicking Not You (#87) 2023-10-03 14:38:20 -05:00
Brian Yencho
92981cefd6 Disable LandingScreen Continue button until data is entered (#89) 2023-10-03 14:38:02 -05:00
Brian Yencho
28461d6306 BIT-133: Update Proguard rules to fix login issues (#85) 2023-10-03 14:37:29 -05:00
Ramsey Smith
39cd45648b BIT-398: Launch ACTION_VIEW Intent with captcha URL and handle callback (#88) 2023-10-03 13:34:51 -06:00
Brian Yencho
fe06a3589d Add BitwardenPasswordField (#82) 2023-10-02 15:37:23 -05:00
joshua-livefront
44974e175b BIT-40: Reskin bottom navigation bar (#81) 2023-10-02 16:11:44 -04:00
Brian Yencho
4e0f20e6f3 Update all current dependencies and include new "surface" colors (#79) 2023-10-02 13:22:15 -05:00
Andrew Haisting
ea24a77b33 BIT-587 Add ConfigService layer to wrap ConfigApi (#80) 2023-10-02 13:20:32 -05:00
joshua-livefront
0f436f6d53 BIT-691: Adding typography values from design, adding Roboto fonts to res (#78) 2023-10-02 13:17:46 -05:00
Brian Yencho
be78a4dd90 BIT-544: Use "surface" as background color on Landing (#76)
Co-authored-by: joshua-livefront <139182194+joshua-livefront@users.noreply.github.com>
2023-09-29 15:41:45 -05:00
Brian Yencho
e476bb8515 BIT-147: Improve splash screen in dark mode (#75) 2023-09-29 11:25:59 -05:00
joshua-livefront
3ccceb977c BIT-690: Adding color palette and colors to light and dark themes (#74) 2023-09-29 10:55:21 -04:00
Ramsey Smith
43a476ad78 BIT-332: Launch web view for hcaptchca (#73) 2023-09-28 14:19:14 -06:00
Brian Yencho
3a24378fcd BIT-147: Improve splash screen handling for all OS levels (#72) 2023-09-28 14:18:03 -05:00
Brian Yencho
191e78a492 BIT-544: Apply reskin to LandingScreen (#71) 2023-09-28 09:29:32 -05:00
joshua-livefront
a115635716 BIT-333: Adding UI tests for the Generator screen (#70) 2023-09-28 10:08:46 -04:00
Brian Yencho
998178f22a Reskin BitwardenTextInput and pull out "layout parameters" (#69) 2023-09-26 15:17:32 -05:00
joshua-livefront
95489cbf83 Adding shadow log stream to BaseComposeTest (#68) 2023-09-26 14:16:37 -04:00
Ramsey Smith
e62af9bbf5 BIT-651: Create sync response model (#67) 2023-09-26 10:50:32 -06:00
renovate[bot]
5247dc6f2a chore(deps): update gh minor (#66)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-26 11:00:47 -04:00
joshua-livefront
0f4e16b542 BIT-333: Handle Passphrase state in GeneratorViewModel (#64) 2023-09-25 15:12:26 -04:00
renovate[bot]
26e447d71d chore(deps): update bitwarden/gh-actions digest to 62d1bf7 (#65)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 08:34:17 -04:00
Andrew Haisting
a2c367b217 BIT-201 Update nav library version and remove workarounds (#63) 2023-09-21 17:00:49 -05:00
Brian Yencho
0354f8a8cb Update Bitwarden SDK to 0.3.0-SNAPSHOT (#60) 2023-09-21 16:05:26 -05:00
Andrew Haisting
b6fec01be1 BIT-394 Setup service layer to accommodate get token error parsing (#61) 2023-09-21 16:03:54 -05:00
Andrew Haisting
ef8ecbf0e8 Auto format libs.versions.toml (#62) 2023-09-21 16:03:40 -05:00
Ramsey Smith
b8d19fcedf BIT-405: AuthTokenInterceptor (#57) 2023-09-21 11:35:32 -06:00
Andrew Haisting
dc793accd0 BIT-588 Relax documentation requirements deep within the network layer (#58) 2023-09-21 11:50:55 -05:00
Andrew Haisting
8c51f36008 BIT-589 Prevent crash on Landing when navigating with empty input (#59) 2023-09-21 11:47:28 -05:00
Andrew Haisting
61793d6659 Update naming: mutableAccessTokenFlow -> mutableAuthStateFlow (#56) 2023-09-21 11:40:40 -05:00
Brian Yencho
269babfa92 Add Proguard rules for JNA and the SDK (#55) 2023-09-19 16:27:15 -05:00
Andrew Haisting
b549a6dfff BIT-289 Remove deprecated BitwardenTextField (#53) 2023-09-19 14:05:51 -05:00
Brian Yencho
11ec7c6962 BIT-4: Add shared debug.keystore and debug signing config (#54) 2023-09-19 13:17:29 -05:00
Andrew Haisting
980c4ad452 BIT-133 Implement happy path login (#52) 2023-09-19 09:36:55 -05:00
Andrew Haisting
99b1fa1f4e Add flatMap for Result type (#51) 2023-09-18 14:34:25 -05:00
renovate[bot]
1df225a319 chore(deps): update bitwarden/gh-actions digest to 8fccdae (#27)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-18 10:44:59 -04:00
Brian Yencho
d7a3593e2f Use 100 character line limit for detekt (#50) 2023-09-15 09:04:49 -05:00
Brian Yencho
ef735a94d8 BIT-282: Include Bitwarden SDK dependency (#44) 2023-09-14 16:27:34 -05:00
Ramsey Smith
1c1c8c51e0 Fixed bottom nav bar. (#49) 2023-09-14 15:20:28 -06:00
Ramsey Smith
e2a857df8c BIT-151: Added Wireframe for Vault Screen (#48) 2023-09-14 13:02:56 -06:00
Andrew Haisting
c1472ee078 Remove accidental usages of viewModel() in favor of hiltViewModel() (#47) 2023-09-13 17:58:40 -05:00
Brian Yencho
52b9395f70 BIT-168: Add FakeNavHostController and tests for RootNavScreen (#46)
Co-authored-by: Andrew Haisting <ahaisting@livefront.com>
2023-09-13 14:41:56 -05:00
Brian Yencho
9e156fe70f Ignore user.properties files (#45) 2023-09-13 11:34:48 -05:00
Ramsey Smith
59fe2d9759 BIT-304: Add Strings.xml and translations (#43) 2023-09-12 08:34:46 -05:00
Brian Yencho
8c6a249fb2 BIT-3: Add initial CI workflow to run tests and lint checks (#41) 2023-09-11 15:51:59 -05:00
Andrew Haisting
ef3bb19f8c BIT-141 Implement basic SplashScreen composable (#39) 2023-09-11 15:20:13 -05:00
Andrew Haisting
7be86b806f BIT-141 Setup basic Login and Landing screens (#40)
Co-authored-by: Caleb Derosier <caleb@livefront.com>
2023-09-11 14:44:09 -05:00
Matt Bishop
ac1ee3f2a3 Delete unused local lint workflow (#38) 2023-09-11 12:48:20 -04:00
joshua-livefront
f2c1207832 [BIT-148] Adding wireframe UI for password generator screen (#37) 2023-09-11 10:16:18 -04:00
Brian Yencho
0c6446c4f6 Fix unused imports in test files resulting from file structure changes (#33) 2023-09-07 09:04:24 -05:00
Andrew Haisting
6c4a62796b BIT-267 make sure root navigation state doesn't get blown away after … (#32) 2023-09-06 16:52:31 -05:00
Brian Yencho
40e771ec69 BIT-139: Distinguish dev and release builds (#31) 2023-09-06 11:38:04 -05:00
joshua-livefront
129d5d56bc feat: Updating composables to use hiltViewModel as opposed to viewModel (#29) 2023-09-06 09:47:08 -04:00
Andrew Haisting
e428640948 Update imports (#30) 2023-09-05 16:41:16 -05:00
Ramsey Smith
3bed69bc45 BIT-143: Add initial bottom navigation screen (#25)
Co-authored-by: Brian Yencho <brian@livefront.com>
2023-09-05 15:44:50 -05:00
Brian Yencho
ee77052739 BIT-200: Update CODEOWNERS file and restructure folders accordingly (#26) 2023-09-05 13:13:26 -05:00
Andrew Haisting
22bb07b473 Cosmetic test fixes (#24) 2023-09-05 11:10:12 -05:00
Caleb Derosier
7878b70a47 Rename Login navigation components to Auth (#23) 2023-09-05 10:16:39 -05:00
Brian Yencho
1749f4b1b6 BIT-176: Add initial project information to README (#22) 2023-09-05 10:14:01 -05:00
Caleb Derosier
acba9a1604 Fix incorrect label & initial value for email input label (#21) 2023-08-31 13:57:34 -05:00
Brian Yencho
70e4a6d989 Update all navigateTo helpers to pass NavOptions (#20) 2023-08-31 13:23:07 -05:00
Caleb Derosier
e97659c7c9 Add initial Landing screen & Login nav graph (#19) 2023-08-31 08:41:56 -05:00
Andrew Haisting
7f0d09a93b Downgrade navigation version due to saved state bug (#18) 2023-08-30 14:46:53 -05:00
Andrew Haisting
2afae28f6b setup EventsEffect (#17) 2023-08-30 14:23:21 -05:00
Robyn MacCallum
ad6aa0539c Update CODEOWNERS (#16) 2023-08-29 20:44:51 +01:00
Andrew Haisting
6bbc6cab8c BIT-142: setup create account screen (#15) 2023-08-29 14:20:02 -05:00
Brian Yencho
f67d4ccad3 Add BaseComposeTest for facilitating compose-layer testing (#14) 2023-08-29 13:07:55 -05:00
Andrew Haisting
ab92fd7943 use Bitwarden theme in MainActivity (#13) 2023-08-29 09:43:15 -05:00
Brian Yencho
8d3cf4fcd8 BIT-153: Add initial code style documentation and formatter (#12) 2023-08-29 08:24:11 -05:00
renovate[bot]
caa80947f9 Update bitwarden/gh-actions digest to 67ab95d (#2)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-28 16:23:24 +01:00
Brian Yencho
ece5fe6a37 BIT-145: Add BaseViewModel and update existing ViewModels (#11) 2023-08-28 09:37:05 -05:00
Brian Yencho
b09df2fa5a Fix initial detekt issues (#10) 2023-08-25 16:02:26 -05:00
Andrew Haisting
cbd9cf51c4 BIT-5, BIT-101: Setup networking layer add get config call (#9)
Co-authored-by: joshua-livefront <joshua@livefront.com>
2023-08-25 08:54:47 -05:00
Andrew Haisting
4b7b84662d BIT-144: Setup root level app navigation (#8) 2023-08-25 08:54:18 -05:00
Brian Yencho
de2eed7c24 Initial project setup (BIT-61) (#7) 2023-08-22 16:03:42 -05:00
35 changed files with 2447 additions and 87 deletions

View File

@@ -55,6 +55,17 @@
<data android:mimeType="video/*" />
<data android:mimeType="text/*" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="bitwarden.com" />
<data android:host="bitwarden.pw" />
<data android:host="bitwarden.eu" />
</intent-filter>
</activity>
<activity

View File

@@ -23,6 +23,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject
import android.net.Uri
/**
* Primary entry point for the application.
@@ -74,6 +75,15 @@ class MainActivity : AppCompatActivity() {
}
}
}
val appLinkData: Uri? = intent.data
if (appLinkData != null && appLinkData.isHierarchical) {
mainViewModel.trySendAction(
action = MainAction.ReceiveNewIntent(
intent = intent,
),
)
}
}
override fun onNewIntent(intent: Intent) {

View File

@@ -5,7 +5,9 @@ import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.bitwarden.vault.CipherView
import com.google.firebase.Timestamp
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.util.getCompleteRegistrationDataIntentOrNull
import com.x8bit.bitwarden.data.auth.util.getPasswordlessRequestDataIntentOrNull
import com.x8bit.bitwarden.data.autofill.fido2.util.getFido2CredentialRequestOrNull
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManager
@@ -174,6 +176,7 @@ class MainViewModel @Inject constructor(
val hasGeneratorShortcut = intent.isPasswordGeneratorShortcut
val hasVaultShortcut = intent.isMyVaultShortcut
val fido2CredentialRequestData = intent.getFido2CredentialRequestOrNull()
val completeRegistrationData = intent.getCompleteRegistrationDataIntentOrNull()
when {
passwordlessRequestData != null -> {
specialCircumstanceManager.specialCircumstance =
@@ -185,6 +188,14 @@ class MainViewModel @Inject constructor(
)
}
completeRegistrationData != null -> {
specialCircumstanceManager.specialCircumstance =
SpecialCircumstance.CompleteRegistration(
completeRegistrationData = completeRegistrationData,
timestamp = Timestamp.now()
)
}
autofillSaveItem != null -> {
specialCircumstanceManager.specialCircumstance =
SpecialCircumstance.AutofillSave(

View File

@@ -0,0 +1,19 @@
package com.x8bit.bitwarden.data.auth.util
import android.content.Intent
import com.x8bit.bitwarden.data.platform.manager.model.CompleteRegistrationData
/**
* Checks if the given [Intent] contains data to complete registration.
* The [CompleteRegistrationData] will be returned when present.
*/
fun Intent.getCompleteRegistrationDataIntentOrNull(): CompleteRegistrationData? {
val uri = data ?: return null
val email = uri?.getQueryParameter("email") ?: return null
val verificationToken = uri.getQueryParameter("verificationtoken") ?: return null
return CompleteRegistrationData(
email = email,
verificationToken = verificationToken
)
}

View File

@@ -0,0 +1,16 @@
package com.x8bit.bitwarden.data.platform.manager.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
/**
* Required data to complete ongoing registration process.
*
* @property email The email of the user creating the account.
* @property verificationToken The token required to finish the registration process.
*/
@Parcelize
data class CompleteRegistrationData(
val email: String,
val verificationToken: String,
) : Parcelable

View File

@@ -1,6 +1,7 @@
package com.x8bit.bitwarden.data.platform.manager.model
import android.os.Parcelable
import com.google.firebase.Timestamp
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.model.AutofillSaveItem
import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData
@@ -48,6 +49,15 @@ sealed class SpecialCircumstance : Parcelable {
val shouldFinishWhenComplete: Boolean,
) : SpecialCircumstance()
/**
* The app was launched via AppLink in order to allow the user complete an ongoing registration.
*/
@Parcelize
data class CompleteRegistration(
val completeRegistrationData: CompleteRegistrationData,
val timestamp: Timestamp
) : SpecialCircumstance()
/**
* The app was launched via the credential manager framework in order to allow the user to
* manually save a passkey to their vault.

View File

@@ -17,6 +17,7 @@ fun SpecialCircumstance.toAutofillSaveItemOrNull(): AutofillSaveItem? =
SpecialCircumstance.GeneratorShortcut -> null
SpecialCircumstance.VaultShortcut -> null
is SpecialCircumstance.Fido2Save -> null
is SpecialCircumstance.CompleteRegistration -> null
}
/**
@@ -31,6 +32,7 @@ fun SpecialCircumstance.toAutofillSelectionDataOrNull(): AutofillSelectionData?
SpecialCircumstance.GeneratorShortcut -> null
SpecialCircumstance.VaultShortcut -> null
is SpecialCircumstance.Fido2Save -> null
is SpecialCircumstance.CompleteRegistration -> null
}
/**

View File

@@ -6,6 +6,10 @@ import androidx.navigation.NavHostController
import androidx.navigation.NavOptions
import androidx.navigation.navOptions
import androidx.navigation.navigation
import com.x8bit.bitwarden.ui.auth.feature.checkemail.checkEmailDestination
import com.x8bit.bitwarden.ui.auth.feature.checkemail.navigateToCheckEmail
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.completeRegistrationDestination
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.navigateToCompleteRegistration
import com.x8bit.bitwarden.ui.auth.feature.createaccount.createAccountDestination
import com.x8bit.bitwarden.ui.auth.feature.createaccount.navigateToCreateAccount
import com.x8bit.bitwarden.ui.auth.feature.enterprisesignon.enterpriseSignOnDestination
@@ -23,6 +27,8 @@ import com.x8bit.bitwarden.ui.auth.feature.masterpasswordhint.masterPasswordHint
import com.x8bit.bitwarden.ui.auth.feature.masterpasswordhint.navigateToMasterPasswordHint
import com.x8bit.bitwarden.ui.auth.feature.setpassword.navigateToSetPassword
import com.x8bit.bitwarden.ui.auth.feature.setpassword.setPasswordDestination
import com.x8bit.bitwarden.ui.auth.feature.startregistration.navigateToStartRegistration
import com.x8bit.bitwarden.ui.auth.feature.startregistration.startRegistrationDestination
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.navigateToTwoFactorLogin
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.twoFactorLoginDestination
@@ -49,6 +55,28 @@ fun NavGraphBuilder.authGraph(navController: NavHostController) {
)
},
)
startRegistrationDestination(
onNavigateBack = { navController.popBackStack() },
// TODO check necessary parameters
onNavigateToCompleteRegistration = { emailAddress, verificationToken, captchaToken ->
navController.navigateToCompleteRegistration()
},
onNavigateToCheckEmail = {emailAddress ->
navController.navigateToCheckEmail(emailAddress)
},
onNavigateToEnvironment = { navController.navigateToEnvironment() }
)
checkEmailDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateBackToLanding = {
navController.popBackStack(route = LANDING_ROUTE, inclusive = false)
})
completeRegistrationDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateToLogin = { emailAddress, captchaToken ->
navController.navigateToLogin(emailAddress, captchaToken)
},
)
enterpriseSignOnDestination(
onNavigateBack = { navController.popBackStack() },
onNavigateToSetPassword = { navController.navigateToSetPassword() },
@@ -71,6 +99,7 @@ fun NavGraphBuilder.authGraph(navController: NavHostController) {
onNavigateToEnvironment = {
navController.navigateToEnvironment()
},
onNavigateToStartRegistration = { navController.navigateToStartRegistration()}
)
loginDestination(
onNavigateBack = { navController.popBackStack() },

View File

@@ -0,0 +1,52 @@
package com.x8bit.bitwarden.ui.auth.feature.checkemail
import androidx.lifecycle.SavedStateHandle
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions
private const val EMAIL_ADDRESS: String = "email"
private const val CHECK_EMAIL_ROUTE: String = "check_email/{$EMAIL_ADDRESS}"
/**
* Navigate to the check email screen.
*/
fun NavController.navigateToCheckEmail(emailAddress: String, navOptions: NavOptions? = null) {
this.navigate("check_email/$emailAddress", navOptions)
}
/**
* Class to retrieve check email arguments from the [SavedStateHandle].
*/
@OmitFromCoverage
data class CheckEmailArgs(
val emailAddress: String
) {
constructor(savedStateHandle: SavedStateHandle) : this(
emailAddress = checkNotNull(savedStateHandle.get<String>(EMAIL_ADDRESS)),
)
}
/**
* Add the check email screen to the nav graph.
*/
fun NavGraphBuilder.checkEmailDestination(
onNavigateBack: () -> Unit,
onNavigateBackToLanding: () -> Unit,
) {
composableWithSlideTransitions(
route = CHECK_EMAIL_ROUTE,
arguments = listOf(
navArgument(EMAIL_ADDRESS) { type = NavType.StringType },
)
) {
CheckEmailScreen(
onNavigateBack = onNavigateBack,
onNavigateBackToLanding = onNavigateBackToLanding
)
}
}

View File

@@ -0,0 +1,232 @@
package com.x8bit.bitwarden.ui.auth.feature.checkemail
import android.content.Intent
import android.net.Uri
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
/**
* Top level composable for the check email screen.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("LongMethod")
@Composable
fun CheckEmailScreen(
onNavigateBack: () -> Unit,
onNavigateBackToLanding: () -> Unit,
intentManager: IntentManager = LocalIntentManager.current,
viewModel: CheckEmailViewModel = hiltViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
EventsEffect(viewModel) { event ->
when (event) {
is CheckEmailEvent.NavigateBack -> {
onNavigateBack.invoke()
}
is CheckEmailEvent.NavigateToEmailApp -> {
val intent = Intent(Intent.ACTION_SENDTO)
intent.setData(Uri.parse("mailto:"))
intentManager.startActivity(intent)
}
is CheckEmailEvent.NavigateBackToLanding -> {
onNavigateBackToLanding.invoke()
}
}
}
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
BitwardenScaffold(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
BitwardenTopAppBar(
title = stringResource(id = R.string.create_account),
scrollBehavior = scrollBehavior,
navigationIcon = rememberVectorPainter(id = R.drawable.ic_close),
navigationIconContentDescription = stringResource(id = R.string.close),
onNavigationIconClick = remember(viewModel) {
{ viewModel.trySendAction(CheckEmailAction.CloseTap) }
}
)
},
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.imePadding()
.fillMaxSize()
.verticalScroll(rememberScrollState()),
) {
Spacer(modifier = Modifier.height(32.dp))
Image(
painter = rememberVectorPainter(id = R.drawable.email_check),
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary),
contentDescription = null,
contentScale = ContentScale.FillHeight,
modifier = Modifier
.padding(horizontal = 16.dp)
.height(112.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(32.dp))
Text(
text = stringResource(id = R.string.check_your_email),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier
.padding(horizontal = 24.dp)
.wrapContentHeight()
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(16.dp))
val descriptionAnnotatedString = CreateAnnotatedString(
mainText = stringResource(id = R.string.follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account, state.email),
highlightText = state.email,
highlightSpanStyle = SpanStyle(
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold
)
)
Text(
text = descriptionAnnotatedString,
textAlign = TextAlign.Center,
modifier = Modifier
.padding(horizontal = 24.dp)
.fillMaxWidth()
.wrapContentHeight(),
)
Spacer(modifier = Modifier.height(32.dp))
BitwardenFilledButton(
label = stringResource(id = R.string.open_email_app),
onClick = remember(viewModel) {
{ viewModel.trySendAction(CheckEmailAction.OpenEmailTap) }
},
modifier = Modifier
.testTag("OpenEmailApp")
.padding(horizontal = 16.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(32.dp))
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
val goBackAnnotatedString = CreateAnnotatedString(
mainText = stringResource(id = R.string.no_email_go_back_to_edit_your_email_address),
highlightText = stringResource(id = R.string.go_back)
)
ClickableText(
text = goBackAnnotatedString,
onClick = {
goBackAnnotatedString
.getStringAnnotations("URL", it, it)
.firstOrNull()?.let {
viewModel.trySendAction(CheckEmailAction.CloseTap)
}
}
)
Spacer(modifier = Modifier.height(32.dp))
val logInAnnotatedString = CreateAnnotatedString(
mainText = stringResource(id = R.string.or_log_in_you_may_already_have_an_account),
highlightText = stringResource(id = R.string.log_in)
)
ClickableText(
text = logInAnnotatedString,
onClick = {
logInAnnotatedString
.getStringAnnotations("URL", it, it)
.firstOrNull()?.let {
viewModel.trySendAction(CheckEmailAction.LoginTap)
}
}
)
}
Spacer(modifier = Modifier.navigationBarsPadding())
}
}
}
@Composable
private fun CreateAnnotatedString(
mainText: String,
highlightText: String,
mainSpanStyle: SpanStyle = SpanStyle(
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.bodyMedium.fontSize
),
highlightSpanStyle: SpanStyle = SpanStyle(
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold
)
): AnnotatedString {
return buildAnnotatedString {
val startIndex = mainText.indexOf(highlightText, ignoreCase = true)
val endIndex = startIndex + highlightText.length
append(mainText)
addStyle(
style = mainSpanStyle,
start = 0,
end = mainText.length
)
addStyle(
style = highlightSpanStyle,
start = startIndex,
end = endIndex
)
addStringAnnotation(
tag = "URL",
annotation = highlightText,
start = startIndex,
end = endIndex
)
}
}

View File

@@ -0,0 +1,93 @@
package com.x8bit.bitwarden.ui.auth.feature.checkemail
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.parcelize.Parcelize
import javax.inject.Inject
private const val KEY_STATE = "state"
/**
* Models logic for the check email screen.
*/
@Suppress("TooManyFunctions")
@HiltViewModel
class CheckEmailViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : BaseViewModel<CheckEmailState, CheckEmailEvent, CheckEmailAction>(
initialState = savedStateHandle[KEY_STATE]
?: CheckEmailState(
email = CheckEmailArgs(savedStateHandle).emailAddress
),
) {
init {
// As state updates, write to saved state handle:
stateFlow
.onEach { savedStateHandle[KEY_STATE] = it }
.launchIn(viewModelScope)
}
override fun handleAction(action: CheckEmailAction) {
when (action) {
CheckEmailAction.CloseTap -> sendEvent(CheckEmailEvent.NavigateBack)
CheckEmailAction.LoginTap -> sendEvent(CheckEmailEvent.NavigateBackToLanding)
CheckEmailAction.OpenEmailTap -> sendEvent(CheckEmailEvent.NavigateToEmailApp)
}
}
}
/**
* UI state for the check email screen.
*/
@Parcelize
data class CheckEmailState(
val email: String
) : Parcelable {
}
/**
* Models events for the check email screen.
*/
sealed class CheckEmailEvent {
/**
* Navigate back to previous screen.
*/
data object NavigateBack : CheckEmailEvent()
/**
* Navigate to email app.
*/
data object NavigateToEmailApp : CheckEmailEvent()
/**
* Navigate to email app.
*/
data object NavigateBackToLanding : CheckEmailEvent()
}
/**
* Models actions for the check email screen.
*/
sealed class CheckEmailAction {
/**
* User tapped close.
*/
data object CloseTap : CheckEmailAction()
/**
* User tapped log in.
*/
data object LoginTap : CheckEmailAction()
/**
* User tapped open email.
*/
data object OpenEmailTap : CheckEmailAction()
}

View File

@@ -0,0 +1,34 @@
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
import androidx.lifecycle.SavedStateHandle
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions
private const val COMPLETE_REGISTRATION_ROUTE = "complete_registration"
/**
* Navigate to the complete registration screen.
*/
fun NavController.navigateToCompleteRegistration(navOptions: NavOptions? = null) {
this.navigate(COMPLETE_REGISTRATION_ROUTE, navOptions)
}
/**
* Add the complete registration screen to the nav graph.
*/
fun NavGraphBuilder.completeRegistrationDestination(
onNavigateBack: () -> Unit,
onNavigateToLogin: (emailAddress: String, captchaToken: String) -> Unit,
) {
composableWithSlideTransitions(
route = COMPLETE_REGISTRATION_ROUTE,
) {
CompleteRegistrationScreen(
onNavigateBack = onNavigateBack,
onNavigateToLogin = onNavigateToLogin
)
}
}

View File

@@ -0,0 +1,241 @@
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
import android.widget.Toast
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.CheckDataBreachesToggle
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.CloseClick
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ConfirmPasswordInputChange
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ContinueWithBreachedPasswordClick
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ErrorDialogDismiss
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordHintChange
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordInputChange
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.LoadingDialogState
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
/**
* Top level composable for the complete registration screen.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("LongMethod")
@Composable
fun CompleteRegistrationScreen(
onNavigateBack: () -> Unit,
onNavigateToLogin: (emailAddress: String, captchaToken: String) -> Unit,
intentManager: IntentManager = LocalIntentManager.current,
viewModel: CompleteRegistrationViewModel = hiltViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
val context = LocalContext.current
EventsEffect(viewModel) { event ->
when (event) {
is CompleteRegistrationEvent.NavigateBack -> onNavigateBack.invoke()
is CompleteRegistrationEvent.ShowToast -> {
Toast.makeText(context, event.text, Toast.LENGTH_SHORT).show()
}
is CompleteRegistrationEvent.NavigateToCaptcha -> {
intentManager.startCustomTabsActivity(uri = event.uri)
}
is CompleteRegistrationEvent.NavigateToLogin -> {
onNavigateToLogin(
event.email,
event.captchaToken,
)
}
}
}
// Show dialog if needed:
when (val dialog = state.dialog) {
is CompleteRegistrationDialog.Error -> {
BitwardenBasicDialog(
visibilityState = dialog.state,
onDismissRequest = remember(viewModel) {
{ viewModel.trySendAction(ErrorDialogDismiss) }
},
)
}
is CompleteRegistrationDialog.HaveIBeenPwned -> {
BitwardenTwoButtonDialog(
title = dialog.title(),
message = dialog.message(),
confirmButtonText = stringResource(id = R.string.yes),
dismissButtonText = stringResource(id = R.string.no),
onConfirmClick = remember(viewModel) {
{ viewModel.trySendAction(ContinueWithBreachedPasswordClick) }
},
onDismissClick = remember(viewModel) {
{ viewModel.trySendAction(ErrorDialogDismiss) }
},
onDismissRequest = remember(viewModel) {
{ viewModel.trySendAction(ErrorDialogDismiss) }
},
)
}
CompleteRegistrationDialog.Loading -> {
BitwardenLoadingDialog(
visibilityState = LoadingDialogState.Shown(R.string.create_account.asText()),
)
}
null -> Unit
}
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
BitwardenScaffold(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
BitwardenTopAppBar(
title = stringResource(id = R.string.set_password),
scrollBehavior = scrollBehavior,
navigationIcon = rememberVectorPainter(id = R.drawable.ic_close),
navigationIconContentDescription = stringResource(id = R.string.close),
onNavigationIconClick = remember(viewModel) {
{ viewModel.trySendAction(CloseClick) }
},
actions = {
BitwardenTextButton(
label = stringResource(id = R.string.create_account),
onClick = remember(viewModel) {
{ viewModel.trySendAction(CompleteRegistrationAction.CreateAccountClick) }
},
modifier = Modifier.testTag("CreateAccountButton"),
)
},
)
},
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.imePadding()
.fillMaxSize()
.verticalScroll(rememberScrollState()),
) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = stringResource(
id = R.string.follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account,
state.userEmail
),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(16.dp))
var showPassword by rememberSaveable { mutableStateOf(false) }
BitwardenPasswordField(
label = stringResource(id = R.string.master_password),
showPassword = showPassword,
showPasswordChange = { showPassword = it },
value = state.passwordInput,
hint = state.passwordLengthLabel(),
onValueChange = remember(viewModel) {
{ viewModel.trySendAction(PasswordInputChange(it)) }
},
modifier = Modifier
.testTag("MasterPasswordEntry")
.fillMaxWidth()
.padding(horizontal = 16.dp),
showPasswordTestTag = "PasswordVisibilityToggle",
)
Spacer(modifier = Modifier.height(8.dp))
PasswordStrengthIndicator(
modifier = Modifier.padding(horizontal = 16.dp),
state = state.passwordStrengthState,
)
Spacer(modifier = Modifier.height(8.dp))
BitwardenPasswordField(
label = stringResource(id = R.string.retype_master_password),
value = state.confirmPasswordInput,
showPassword = showPassword,
showPasswordChange = { showPassword = it },
onValueChange = remember(viewModel) {
{ viewModel.trySendAction(ConfirmPasswordInputChange(it)) }
},
modifier = Modifier
.testTag("ConfirmMasterPasswordEntry")
.fillMaxWidth()
.padding(horizontal = 16.dp),
showPasswordTestTag = "ConfirmPasswordVisibilityToggle",
)
Spacer(modifier = Modifier.height(16.dp))
BitwardenTextField(
label = stringResource(id = R.string.master_password_hint),
value = state.passwordHintInput,
onValueChange = remember(viewModel) {
{ viewModel.trySendAction(PasswordHintChange(it)) }
},
hint = stringResource(id = R.string.master_password_hint_description),
modifier = Modifier
.testTag("MasterPasswordHintLabel")
.fillMaxWidth()
.padding(horizontal = 16.dp),
)
Spacer(modifier = Modifier.height(24.dp))
BitwardenSwitch(
label = stringResource(id = R.string.check_known_data_breaches_for_this_password),
isChecked = state.isCheckDataBreachesToggled,
onCheckedChange = remember(viewModel) {
{ newState ->
viewModel.trySendAction(CheckDataBreachesToggle(newState = newState))
}
},
modifier = Modifier
.testTag("CheckExposedMasterPasswordToggle")
.padding(horizontal = 16.dp),
)
Spacer(modifier = Modifier.navigationBarsPadding())
}
}
}

View File

@@ -0,0 +1,524 @@
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
import android.net.Uri
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult
import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult
import com.x8bit.bitwarden.data.auth.repository.util.CaptchaCallbackTokenResult
import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
import com.x8bit.bitwarden.data.platform.manager.util.toFido2RequestOrNull
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.CheckDataBreachesToggle
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ConfirmPasswordInputChange
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ContinueWithBreachedPasswordClick
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.Internal.ReceivePasswordStrengthResult
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordHintChange
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordInputChange
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.Text
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.base.util.concat
import com.x8bit.bitwarden.ui.platform.base.util.isValidEmail
import com.x8bit.bitwarden.ui.platform.components.dialog.BasicDialogState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
import javax.inject.Inject
private const val KEY_STATE = "state"
private const val MIN_PASSWORD_LENGTH = 12
/**
* Models logic for the create account screen.
*/
@Suppress("TooManyFunctions")
@HiltViewModel
class CompleteRegistrationViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val authRepository: AuthRepository
) : BaseViewModel<CompleteRegistrationState, CompleteRegistrationEvent, CompleteRegistrationAction>(
initialState = savedStateHandle[KEY_STATE]
?: CompleteRegistrationState(
userEmail = "",
emailVerificationToken = "",
passwordInput = "",
confirmPasswordInput = "",
passwordHintInput = "",
isCheckDataBreachesToggled = true,
dialog = null,
passwordStrengthState = PasswordStrengthState.NONE,
),
) {
/**
* Keeps track of async request to get password strength. Should be cancelled
* when user input changes.
*/
private var passwordStrengthJob: Job = Job().apply { complete() }
init {
// As state updates, write to saved state handle:
stateFlow
.onEach { savedStateHandle[KEY_STATE] = it }
.launchIn(viewModelScope)
authRepository
.captchaTokenResultFlow
.onEach {
sendAction(
CompleteRegistrationAction.Internal.ReceiveCaptchaToken(
tokenResult = it,
),
)
}
.launchIn(viewModelScope)
}
override fun handleAction(action: CompleteRegistrationAction) {
when (action) {
is CompleteRegistrationAction.CreateAccountClick -> handleCreateAccountClick()
is ConfirmPasswordInputChange -> handleConfirmPasswordInputChanged(action)
is PasswordHintChange -> handlePasswordHintChanged(action)
is PasswordInputChange -> handlePasswordInputChanged(action)
is CompleteRegistrationAction.CloseClick -> handleCloseClick()
is CompleteRegistrationAction.ErrorDialogDismiss -> handleDialogDismiss()
is CheckDataBreachesToggle -> handleCheckDataBreachesToggle(action)
is CompleteRegistrationAction.Internal.ReceiveRegisterResult -> {
handleReceiveRegisterAccountResult(action)
}
is CompleteRegistrationAction.Internal.ReceiveCaptchaToken -> {
handleReceiveCaptchaToken(action)
}
ContinueWithBreachedPasswordClick -> handleContinueWithBreachedPasswordClick()
is ReceivePasswordStrengthResult -> handlePasswordStrengthResult(action)
}
}
private fun handlePasswordStrengthResult(action: ReceivePasswordStrengthResult) {
when (val result = action.result) {
is PasswordStrengthResult.Success -> {
val updatedState = when (result.passwordStrength) {
PasswordStrength.LEVEL_0 -> PasswordStrengthState.WEAK_1
PasswordStrength.LEVEL_1 -> PasswordStrengthState.WEAK_2
PasswordStrength.LEVEL_2 -> PasswordStrengthState.WEAK_3
PasswordStrength.LEVEL_3 -> PasswordStrengthState.GOOD
PasswordStrength.LEVEL_4 -> PasswordStrengthState.STRONG
}
mutableStateFlow.update { oldState ->
oldState.copy(
passwordStrengthState = updatedState,
)
}
}
PasswordStrengthResult.Error -> {
// Leave UI the same
}
}
}
private fun handleReceiveCaptchaToken(
action: CompleteRegistrationAction.Internal.ReceiveCaptchaToken,
) {
when (val result = action.tokenResult) {
is CaptchaCallbackTokenResult.MissingToken -> {
mutableStateFlow.update {
it.copy(
dialog = CompleteRegistrationDialog.Error(
BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.captcha_failed.asText(),
),
),
)
}
}
is CaptchaCallbackTokenResult.Success -> {
submitRegisterAccountRequest(
shouldCheckForDataBreaches = false,
shouldIgnorePasswordStrength = true,
captchaToken = result.token,
)
}
}
}
@Suppress("LongMethod", "MaxLineLength")
private fun handleReceiveRegisterAccountResult(
action: CompleteRegistrationAction.Internal.ReceiveRegisterResult,
) {
when (val registerAccountResult = action.registerResult) {
is RegisterResult.CaptchaRequired -> {
mutableStateFlow.update { it.copy(dialog = null) }
sendEvent(
CompleteRegistrationEvent.NavigateToCaptcha(
uri = generateUriForCaptcha(captchaId = registerAccountResult.captchaId),
),
)
}
is RegisterResult.Error -> {
mutableStateFlow.update {
it.copy(
dialog = CompleteRegistrationDialog.Error(
BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = registerAccountResult.errorMessage?.asText()
?: R.string.generic_error_message.asText(),
),
),
)
}
}
is RegisterResult.Success -> {
mutableStateFlow.update { it.copy(dialog = null) }
sendEvent(
CompleteRegistrationEvent.NavigateToLogin(
email = state.userEmail,
captchaToken = registerAccountResult.captchaToken,
),
)
}
RegisterResult.DataBreachFound -> {
mutableStateFlow.update {
it.copy(
dialog = CompleteRegistrationDialog.HaveIBeenPwned(
title = R.string.exposed_master_password.asText(),
message = R.string.password_found_in_a_data_breach_alert_description.asText(),
),
)
}
}
RegisterResult.DataBreachAndWeakPassword -> {
mutableStateFlow.update {
it.copy(
dialog = CompleteRegistrationDialog.HaveIBeenPwned(
title = R.string.weak_and_exposed_master_password.asText(),
message = R.string.weak_password_identified_and_found_in_a_data_breach_alert_description.asText(),
),
)
}
}
RegisterResult.WeakPassword -> {
mutableStateFlow.update {
it.copy(
dialog = CompleteRegistrationDialog.HaveIBeenPwned(
title = R.string.weak_master_password.asText(),
message = R.string.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(),
),
)
}
}
}
}
private fun handleCheckDataBreachesToggle(action: CheckDataBreachesToggle) {
mutableStateFlow.update {
it.copy(isCheckDataBreachesToggled = action.newState)
}
}
private fun handleDialogDismiss() {
mutableStateFlow.update {
it.copy(dialog = null)
}
}
private fun handleCloseClick() {
sendEvent(CompleteRegistrationEvent.NavigateBack)
}
private fun handlePasswordHintChanged(action: PasswordHintChange) {
mutableStateFlow.update { it.copy(passwordHintInput = action.input) }
}
private fun handlePasswordInputChanged(action: PasswordInputChange) {
// Update input:
mutableStateFlow.update { it.copy(passwordInput = action.input) }
// Update password strength:
passwordStrengthJob.cancel()
if (action.input.isEmpty()) {
mutableStateFlow.update {
it.copy(passwordStrengthState = PasswordStrengthState.NONE)
}
} else {
passwordStrengthJob = viewModelScope.launch {
val result = authRepository.getPasswordStrength(
email = state.userEmail,
password = action.input,
)
trySendAction(ReceivePasswordStrengthResult(result))
}
}
}
private fun handleConfirmPasswordInputChanged(action: ConfirmPasswordInputChange) {
mutableStateFlow.update { it.copy(confirmPasswordInput = action.input) }
}
private fun handleCreateAccountClick() = when {
state.userEmail.isBlank() -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.validation_field_required
.asText(R.string.email_address.asText()),
)
mutableStateFlow.update { it.copy(dialog = CompleteRegistrationDialog.Error(dialog)) }
}
!state.userEmail.isValidEmail() -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.invalid_email.asText(),
)
mutableStateFlow.update { it.copy(dialog = CompleteRegistrationDialog.Error(dialog)) }
}
state.passwordInput.length < MIN_PASSWORD_LENGTH -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.master_password_length_val_message_x.asText(MIN_PASSWORD_LENGTH),
)
mutableStateFlow.update { it.copy(dialog = CompleteRegistrationDialog.Error(dialog)) }
}
state.passwordInput != state.confirmPasswordInput -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.master_password_confirmation_val_message.asText(),
)
mutableStateFlow.update { it.copy(dialog = CompleteRegistrationDialog.Error(dialog)) }
}
else -> {
submitRegisterAccountRequest(
shouldCheckForDataBreaches = state.isCheckDataBreachesToggled,
shouldIgnorePasswordStrength = false,
captchaToken = null,
)
}
}
private fun handleContinueWithBreachedPasswordClick() {
submitRegisterAccountRequest(
shouldCheckForDataBreaches = false,
shouldIgnorePasswordStrength = true,
captchaToken = null,
)
}
private fun submitRegisterAccountRequest(
shouldCheckForDataBreaches: Boolean,
shouldIgnorePasswordStrength: Boolean,
captchaToken: String?,
) {
mutableStateFlow.update {
it.copy(dialog = CompleteRegistrationDialog.Loading)
}
viewModelScope.launch {
val result = authRepository.register(
shouldCheckDataBreaches = shouldCheckForDataBreaches,
isMasterPasswordStrong = shouldIgnorePasswordStrength ||
state.isMasterPasswordStrong,
email = state.userEmail,
masterPassword = state.passwordInput,
masterPasswordHint = state.passwordHintInput.ifBlank { null },
captchaToken = captchaToken,
)
sendAction(
CompleteRegistrationAction.Internal.ReceiveRegisterResult(
registerResult = result,
),
)
}
}
}
/**
* UI state for the complete registration screen.
*/
@Parcelize
data class CompleteRegistrationState(
val userEmail: String,
val emailVerificationToken: String,
val passwordInput: String,
val confirmPasswordInput: String,
val passwordHintInput: String,
val isCheckDataBreachesToggled: Boolean,
val dialog: CompleteRegistrationDialog?,
val passwordStrengthState: PasswordStrengthState,
) : Parcelable {
val passwordLengthLabel: Text
// Have to concat a few strings here, resulting string is:
// Important: Your master password cannot be recovered if you forget it! 12
// characters minimum
@Suppress("MaxLineLength")
get() = R.string.important.asText()
.concat(
": ".asText(),
R.string.your_master_password_cannot_be_recovered_if_you_forget_it_x_characters_minimum
.asText(MIN_PASSWORD_LENGTH),
)
/**
* Whether or not the provided master password is considered strong.
*/
val isMasterPasswordStrong: Boolean
get() = when (passwordStrengthState) {
PasswordStrengthState.NONE,
PasswordStrengthState.WEAK_1,
PasswordStrengthState.WEAK_2,
PasswordStrengthState.WEAK_3,
-> false
PasswordStrengthState.GOOD,
PasswordStrengthState.STRONG,
-> true
}
}
/**
* Models dialogs that can be displayed on the complete registration screen.
*/
sealed class CompleteRegistrationDialog : Parcelable {
/**
* Loading dialog.
*/
@Parcelize
data object Loading : CompleteRegistrationDialog()
/**
* Confirm the user wants to continue with potentially breached password.
*
* @param title The title for the HaveIBeenPwned dialog.
* @param message The message for the HaveIBeenPwned dialog.
*/
@Parcelize
data class HaveIBeenPwned(
val title: Text,
val message: Text,
) : CompleteRegistrationDialog()
/**
* General error dialog with an OK button.
*/
@Parcelize
data class Error(val state: BasicDialogState.Shown) : CompleteRegistrationDialog()
}
/**
* Models events for the complete registration screen.
*/
sealed class CompleteRegistrationEvent {
/**
* Navigate back to previous screen.
*/
data object NavigateBack : CompleteRegistrationEvent()
/**
* Placeholder event for showing a toast. Can be removed once there are real events.
*/
data class ShowToast(val text: String) : CompleteRegistrationEvent()
/**
* Navigates to the captcha verification screen.
*/
data class NavigateToCaptcha(val uri: Uri) : CompleteRegistrationEvent()
/**
* Navigates to the captcha verification screen.
*/
data class NavigateToLogin(
val email: String,
val captchaToken: String,
) : CompleteRegistrationEvent()
}
/**
* Models actions for the complete registration screen.
*/
sealed class CompleteRegistrationAction {
/**
* User clicked create account.
*/
data object CreateAccountClick : CompleteRegistrationAction()
/**
* User clicked close.
*/
data object CloseClick : CompleteRegistrationAction()
/**
* User clicked "Yes" when being asked if they are sure they want to use a breached password.
*/
data object ContinueWithBreachedPasswordClick : CompleteRegistrationAction()
/**
* Password input changed.
*/
data class PasswordInputChange(val input: String) : CompleteRegistrationAction()
/**
* Confirm password input changed.
*/
data class ConfirmPasswordInputChange(val input: String) : CompleteRegistrationAction()
/**
* Password hint input changed.
*/
data class PasswordHintChange(val input: String) : CompleteRegistrationAction()
/**
* User dismissed the error dialog.
*/
data object ErrorDialogDismiss : CompleteRegistrationAction()
/**
* User tapped check data breaches toggle.
*/
data class CheckDataBreachesToggle(val newState: Boolean) : CompleteRegistrationAction()
/**
* Models actions that the [CompleteRegistrationViewModel] itself might send.
*/
sealed class Internal : CompleteRegistrationAction() {
/**
* Indicates a captcha callback token has been received.
*/
data class ReceiveCaptchaToken(
val tokenResult: CaptchaCallbackTokenResult,
) : Internal()
/**
* Indicates a [RegisterResult] has been received.
*/
data class ReceiveRegisterResult(
val registerResult: RegisterResult,
) : Internal()
/**
* Indicates a password strength result has been received.
*/
data class ReceivePasswordStrengthResult(
val result: PasswordStrengthResult,
) : Internal()
}
}

View File

@@ -1,4 +1,4 @@
package com.x8bit.bitwarden.ui.auth.feature.createaccount
package com.x8bit.bitwarden.ui.auth.feature.completeregistration
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateFloatAsState

View File

@@ -49,6 +49,7 @@ import androidx.core.net.toUri
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.AcceptPoliciesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CheckDataBreachesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CloseClick

View File

@@ -11,6 +11,7 @@ import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult
import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult
import com.x8bit.bitwarden.data.auth.repository.util.CaptchaCallbackTokenResult
import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.AcceptPoliciesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CheckDataBreachesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.ConfirmPasswordInputChange

View File

@@ -21,6 +21,7 @@ fun NavGraphBuilder.landingDestination(
onNavigateToCreateAccount: () -> Unit,
onNavigateToLogin: (emailAddress: String) -> Unit,
onNavigateToEnvironment: () -> Unit,
onNavigateToStartRegistration: () -> Unit
) {
composableWithStayTransitions(
route = LANDING_ROUTE,
@@ -29,6 +30,7 @@ fun NavGraphBuilder.landingDestination(
onNavigateToCreateAccount = onNavigateToCreateAccount,
onNavigateToLogin = onNavigateToLogin,
onNavigateToEnvironment = onNavigateToEnvironment,
onNavigateToStartRegistration = onNavigateToStartRegistration
)
}
}

View File

@@ -58,6 +58,7 @@ import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow
import com.x8bit.bitwarden.ui.platform.components.dropdown.EnvironmentSelector
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.x8bit.bitwarden.ui.platform.components.toggle.BitwardenSwitch
@@ -75,6 +76,7 @@ fun LandingScreen(
onNavigateToCreateAccount: () -> Unit,
onNavigateToLogin: (emailAddress: String) -> Unit,
onNavigateToEnvironment: () -> Unit,
onNavigateToStartRegistration: () -> Unit,
viewModel: LandingViewModel = hiltViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
@@ -86,6 +88,7 @@ fun LandingScreen(
)
LandingEvent.NavigateToEnvironment -> onNavigateToEnvironment()
LandingEvent.NavigateToStartRegistration -> onNavigateToStartRegistration()
}
}
@@ -268,6 +271,7 @@ private fun LandingScreenContent(
Spacer(modifier = Modifier.height(2.dp))
EnvironmentSelector(
labelText = stringResource(id = R.string.logging_in_on),
selectedOption = state.selectedEnvironmentType,
onOptionSelected = onEnvironmentTypeSelect,
modifier = Modifier
@@ -326,82 +330,3 @@ private fun LandingScreenContent(
Spacer(modifier = Modifier.navigationBarsPadding())
}
}
/**
* A dropdown selector UI component specific to region url selection on the Landing screen.
*
* This composable displays a dropdown menu allowing users to select a region
* from a list of options. When an option is selected, it invokes the provided callback
* and displays the currently selected region on the UI.
*
* @param selectedOption The currently selected environment option.
* @param onOptionSelected A callback that gets invoked when an environment option is selected
* and passes the selected option as an argument.
* @param modifier A [Modifier] for the composable.
*
*/
@Composable
private fun EnvironmentSelector(
selectedOption: Environment.Type,
onOptionSelected: (Environment.Type) -> Unit,
modifier: Modifier = Modifier,
) {
val options = Environment.Type.entries.toTypedArray()
var shouldShowDialog by rememberSaveable { mutableStateOf(false) }
Box(modifier = modifier) {
Row(
modifier = Modifier
.clip(RoundedCornerShape(28.dp))
.clickable(
indication = rememberRipple(
bounded = true,
color = MaterialTheme.colorScheme.primary,
),
interactionSource = remember { MutableInteractionSource() },
onClick = { shouldShowDialog = !shouldShowDialog },
)
.padding(
vertical = 8.dp,
horizontal = 16.dp,
),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(id = R.string.logging_in_on),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(end = 12.dp),
)
Text(
text = selectedOption.displayLabel(),
style = MaterialTheme.typography.labelLarge,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(end = 8.dp),
)
Icon(
painter = rememberVectorPainter(id = R.drawable.ic_region_select_dropdown),
contentDescription = stringResource(id = R.string.region),
tint = MaterialTheme.colorScheme.primary,
)
}
if (shouldShowDialog) {
BitwardenSelectionDialog(
title = stringResource(id = R.string.logging_in_on),
onDismissRequest = { shouldShowDialog = false },
) {
options.forEach {
BitwardenSelectionRow(
text = it.displayLabel,
onClick = {
onOptionSelected.invoke(it)
shouldShowDialog = false
},
isSelected = it == selectedOption,
)
}
}
}
}
}

View File

@@ -160,7 +160,11 @@ class LandingViewModel @Inject constructor(
}
private fun handleCreateAccountClicked() {
sendEvent(LandingEvent.NavigateToCreateAccount)
// TODO ADD FEATURE FLAG email-verification
if (true)
sendEvent(LandingEvent.NavigateToStartRegistration)
else
sendEvent(LandingEvent.NavigateToCreateAccount)
}
private fun handleDialogDismiss() {
@@ -245,6 +249,11 @@ sealed class LandingEvent {
*/
data object NavigateToCreateAccount : LandingEvent()
/**
* Navigates to the Start Registration screen.
*/
data object NavigateToStartRegistration : LandingEvent()
/**
* Navigates to the Login screen with the given email address and region label.
*/

View File

@@ -0,0 +1,40 @@
package com.x8bit.bitwarden.ui.auth.feature.startregistration
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions
private const val START_REGISTRATION_ROUTE = "start_registration"
/**
* Navigate to the start registration screen.
*/
fun NavController.navigateToStartRegistration(navOptions: NavOptions? = null) {
this.navigate(START_REGISTRATION_ROUTE, navOptions)
}
/**
* Add the start registration screen to the nav graph.
*/
fun NavGraphBuilder.startRegistrationDestination(
onNavigateBack: () -> Unit,
onNavigateToCompleteRegistration: (
emailAddress: String,
verificationToken: String,
captchaToken: String
) -> Unit,
onNavigateToCheckEmail: (email: String) -> Unit,
onNavigateToEnvironment: () -> Unit,
) {
composableWithSlideTransitions(
route = START_REGISTRATION_ROUTE,
) {
StartRegistrationScreen(
onNavigateBack = onNavigateBack,
onNavigateToCompleteRegistration = onNavigateToCompleteRegistration,
onNavigateToCheckEmail = onNavigateToCheckEmail,
onNavigateToEnvironment = onNavigateToEnvironment,
)
}
}

View File

@@ -0,0 +1,409 @@
package com.x8bit.bitwarden.ui.auth.feature.startregistration
import android.widget.Toast
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.semantics.toggleableState
import androidx.compose.ui.state.ToggleableState
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.CloseClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.EmailInputChange
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ErrorDialogDismiss
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.NameInputChange
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.PrivacyPolicyClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.TermsClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEvent.NavigateToPrivacyPolicy
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEvent.NavigateToTerms
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.LoadingDialogState
import com.x8bit.bitwarden.ui.platform.components.dropdown.EnvironmentSelector
import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField
import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
/**
* Top level composable for the start registration screen.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("LongMethod")
@Composable
fun StartRegistrationScreen(
onNavigateBack: () -> Unit,
onNavigateToCompleteRegistration: (
emailAddress: String,
verificationToken: String,
captchaToken: String) -> Unit,
onNavigateToCheckEmail: (email: String) -> Unit,
onNavigateToEnvironment: () -> Unit,
intentManager: IntentManager = LocalIntentManager.current,
viewModel: StartRegistrationViewModel = hiltViewModel(),
) {
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
val context = LocalContext.current
EventsEffect(viewModel) { event ->
when (event) {
is NavigateToPrivacyPolicy -> {
intentManager.launchUri("https://bitwarden.com/privacy/".toUri())
}
is NavigateToTerms -> {
intentManager.launchUri("https://bitwarden.com/terms/".toUri())
}
is StartRegistrationEvent.NavigateToUnsubscribe -> {
intentManager.launchUri("https://bitwarden.com/email-preferences/".toUri())
}
is StartRegistrationEvent.NavigateBack -> onNavigateBack.invoke()
is StartRegistrationEvent.ShowToast -> {
Toast.makeText(context, event.text, Toast.LENGTH_SHORT).show()
}
is StartRegistrationEvent.NavigateToCaptcha -> {
intentManager.startCustomTabsActivity(uri = event.uri)
}
is StartRegistrationEvent.NavigateToCompleteRegistration -> {
onNavigateToCompleteRegistration(
event.email,
event.verificationToken,
event.captchaToken,
)
}
is StartRegistrationEvent.NavigateToCheckEmail -> {
onNavigateToCheckEmail(
event.email
)
}
StartRegistrationEvent.NavigateToEnvironment -> onNavigateToEnvironment()
}
}
// Show dialog if needed:
when (val dialog = state.dialog) {
is StartRegistrationDialog.Error -> {
BitwardenBasicDialog(
visibilityState = dialog.state,
onDismissRequest = remember(viewModel) {
{ viewModel.trySendAction(ErrorDialogDismiss) }
},
)
}
StartRegistrationDialog.Loading -> {
BitwardenLoadingDialog(
visibilityState = LoadingDialogState.Shown(R.string.create_account.asText()),
)
}
null -> Unit
}
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
BitwardenScaffold(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
BitwardenTopAppBar(
title = stringResource(id = R.string.create_account),
scrollBehavior = scrollBehavior,
navigationIcon = rememberVectorPainter(id = R.drawable.ic_close),
navigationIconContentDescription = stringResource(id = R.string.close),
onNavigationIconClick = remember(viewModel) {
{ viewModel.trySendAction(CloseClick) }
}
)
},
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.imePadding()
.fillMaxSize()
.verticalScroll(rememberScrollState()),
) {
Spacer(modifier = Modifier.height(16.dp))
BitwardenTextField(
label = stringResource(id = R.string.email_address),
value = state.emailInput,
onValueChange = remember(viewModel) {
{ viewModel.trySendAction(EmailInputChange(it)) }
},
modifier = Modifier
.testTag("EmailAddressEntry")
.fillMaxWidth()
.padding(horizontal = 16.dp),
keyboardType = KeyboardType.Email,
)
Spacer(modifier = Modifier.height(2.dp))
EnvironmentSelector(
labelText = stringResource(id = R.string.creating_on),
selectedOption = state.selectedEnvironmentType,
onOptionSelected = remember(viewModel) {
{ viewModel.trySendAction(StartRegistrationAction.EnvironmentTypeSelect(it)) }
},
modifier = Modifier
.testTag("RegionSelectorDropdown")
.padding(horizontal = 16.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(16.dp))
BitwardenTextField(
label = stringResource(id = R.string.name),
value = state.nameInput,
onValueChange = remember(viewModel) {
{ viewModel.trySendAction(NameInputChange(it)) }
},
modifier = Modifier
.testTag("NameEntry")
.fillMaxWidth()
.padding(horizontal = 16.dp),
)
Spacer(modifier = Modifier.height(16.dp))
ReceiveMarketingEmailsSwitch(
isChecked = state.isReceiveMarketingEmailsToggled,
onCheckedChange = remember(viewModel) {
{ viewModel.trySendAction(StartRegistrationAction.ReceiveMarketingEmailsToggle(it)) }
},
onUnsubscribeClick = remember(viewModel) {
{ viewModel.trySendAction(StartRegistrationAction.UnsubscribeMarketingEmailsClick) }
}
)
Spacer(modifier = Modifier.height(16.dp))
BitwardenFilledButton(
label = stringResource(id = R.string.continue_text),
onClick = remember(viewModel) {
{ viewModel.trySendAction(StartRegistrationAction.ContinueClick) }
},
isEnabled = state.isContinueButtonEnabled,
modifier = Modifier
.testTag("ContinueButton")
.padding(horizontal = 16.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(16.dp))
TermsAndPrivacyText(
onTermsClick = remember(viewModel) {
{ viewModel.trySendAction(TermsClick) }
},
onPrivacyPolicyClick = remember(viewModel) {
{ viewModel.trySendAction(PrivacyPolicyClick) }
},
)
Spacer(modifier = Modifier.navigationBarsPadding())
}
}
}
@OptIn(ExperimentalLayoutApi::class)
@Suppress("LongMethod")
@Composable
private fun TermsAndPrivacyText(
onTermsClick: () -> Unit,
onPrivacyPolicyClick: () -> Unit,
) {
val annotatedLinkString: AnnotatedString = buildAnnotatedString {
val strTermsAndPrivacy = stringResource(id = R.string.by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy)
val strTerms = stringResource(id = R.string.terms_of_service)
val strPrivacy = stringResource(id = R.string.privacy_policy)
val startIndexTerms = strTermsAndPrivacy.indexOf(strTerms)
val endIndexTerms = startIndexTerms + strTerms.length
val startIndexPrivacy = strTermsAndPrivacy.indexOf(strPrivacy)
val endIndexPrivacy = startIndexPrivacy + strPrivacy.length
append(strTermsAndPrivacy)
addStyle(
style = SpanStyle(
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.bodyMedium.fontSize
),
start = 0,
end = strTermsAndPrivacy.length
)
addStyle(
style = SpanStyle(
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold
),
start = startIndexTerms,
end = endIndexTerms
)
addStyle(
style = SpanStyle(
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold
),
start = startIndexPrivacy,
end = endIndexPrivacy
)
addStringAnnotation(
tag = "URL",
annotation = strTerms,
start = startIndexTerms,
end = endIndexTerms
)
addStringAnnotation(
tag = "URL",
annotation = strPrivacy,
start = startIndexPrivacy,
end = endIndexPrivacy
)
}
Row(
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.semantics(mergeDescendants = true) {
testTag = "DisclaimerText"
}
.fillMaxWidth(),
) {
val termsUrl = stringResource(id = R.string.terms_of_service)
Column(Modifier.padding(start = 16.dp, top = 4.dp, bottom = 4.dp)) {
ClickableText(
text = annotatedLinkString,
style = MaterialTheme.typography.bodyMedium,
onClick = {
annotatedLinkString
.getStringAnnotations("URL", it, it)
.firstOrNull()?.let { stringAnnotation ->
if (stringAnnotation.item == termsUrl)
onTermsClick()
else
onPrivacyPolicyClick()
}
}
)
}
}
}
@Suppress("LongMethod")
@Composable
private fun ReceiveMarketingEmailsSwitch(
isChecked: Boolean,
onCheckedChange: (Boolean) -> Unit,
onUnsubscribeClick: () -> Unit,
) {
val annotatedLinkString: AnnotatedString = buildAnnotatedString {
val strMarketingEmail = stringResource(id = R.string.get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time)
val strUnsubscribe = stringResource(id = R.string.unsubscribe)
val startIndexUnsubscribe = strMarketingEmail.indexOf(strUnsubscribe, ignoreCase = true)
val endIndexUnsubscribe = startIndexUnsubscribe + strUnsubscribe.length
append(strMarketingEmail)
addStyle(
style = SpanStyle(
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.bodyMedium.fontSize
),
start = 0,
end = strMarketingEmail.length
)
addStyle(
style = SpanStyle(
color = MaterialTheme.colorScheme.primary,
fontSize = MaterialTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold
),
start = startIndexUnsubscribe,
end = endIndexUnsubscribe
)
addStringAnnotation(
tag = "URL",
annotation = strUnsubscribe,
start = startIndexUnsubscribe,
end = endIndexUnsubscribe
)
}
Row(
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.semantics(mergeDescendants = true) {
testTag = "ReceiveMarketingEmailsToggle"
toggleableState = ToggleableState(isChecked)
}
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(color = MaterialTheme.colorScheme.primary),
onClick = { onCheckedChange.invoke(!isChecked) },
)
.padding(start = 16.dp)
.fillMaxWidth(),
) {
Switch(
modifier = Modifier
.height(32.dp)
.width(52.dp),
checked = isChecked,
onCheckedChange = null,
)
Column(Modifier.padding(start = 16.dp, top = 4.dp, bottom = 4.dp)) {
ClickableText(
text = annotatedLinkString,
style = MaterialTheme.typography.bodyMedium,
onClick = {
annotatedLinkString
.getStringAnnotations("URL", it, it)
.firstOrNull()?.let {
onUnsubscribeClick()
}
}
)
}
}
}

View File

@@ -0,0 +1,445 @@
package com.x8bit.bitwarden.ui.auth.feature.startregistration
import android.net.Uri
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult
import com.x8bit.bitwarden.data.auth.repository.util.CaptchaCallbackTokenResult
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
import com.x8bit.bitwarden.data.platform.repository.model.Environment
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.EmailInputChange
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.NameInputChange
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.PrivacyPolicyClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.CloseClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.TermsClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ErrorDialogDismiss
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.base.util.isValidEmail
import com.x8bit.bitwarden.ui.platform.components.dialog.BasicDialogState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
import javax.inject.Inject
private const val KEY_STATE = "state"
/**
* Models logic for the start registration screen.
*/
@Suppress("TooManyFunctions")
@HiltViewModel
class StartRegistrationViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val authRepository: AuthRepository,
private val environmentRepository: EnvironmentRepository,
) : BaseViewModel<StartRegistrationState, StartRegistrationEvent, StartRegistrationAction>(
initialState = savedStateHandle[KEY_STATE]
?: StartRegistrationState(
emailInput = "",
nameInput = "",
isReceiveMarketingEmailsToggled = environmentRepository.environment.type == Environment.Type.US,
isContinueButtonEnabled = false,
selectedEnvironmentType = environmentRepository.environment.type,
dialog = null,
),
) {
init {
// As state updates, write to saved state handle:
stateFlow
.onEach { savedStateHandle[KEY_STATE] = it }
.launchIn(viewModelScope)
authRepository
.captchaTokenResultFlow
.onEach {
sendAction(
StartRegistrationAction.Internal.ReceiveCaptchaToken(
tokenResult = it,
),
)
}
.launchIn(viewModelScope)
// Listen for changes in environment triggered both by this VM and externally.
environmentRepository
.environmentStateFlow
.onEach { environment ->
sendAction(
StartRegistrationAction.Internal.UpdatedEnvironmentReceive(environment = environment),
)
}
.launchIn(viewModelScope)
}
override fun handleAction(action: StartRegistrationAction) {
when (action) {
is StartRegistrationAction.ContinueClick -> handleContinueClick()
is EmailInputChange -> handleEmailInputChanged(action)
is NameInputChange -> handleNameInputChanged(action)
is CloseClick -> handleCloseClick()
is ErrorDialogDismiss -> handleDialogDismiss()
is StartRegistrationAction.ReceiveMarketingEmailsToggle -> handleReceiveMarketingEmailsToggle(action)
is PrivacyPolicyClick -> handlePrivacyPolicyClick()
is TermsClick -> handleTermsClick()
is StartRegistrationAction.UnsubscribeMarketingEmailsClick -> handleUnsubscribeMarketingEmailsClick()
is StartRegistrationAction.Internal.ReceiveRegisterResult -> {
// handleReceiveRegisterAccountResult(action)
}
is StartRegistrationAction.Internal.ReceiveCaptchaToken -> {
handleReceiveCaptchaToken(action)
}
is StartRegistrationAction.EnvironmentTypeSelect -> handleEnvironmentTypeSelect(action)
is StartRegistrationAction.Internal.UpdatedEnvironmentReceive -> {
handleUpdatedEnvironmentReceive(action)
}
}
}
private fun handleReceiveCaptchaToken(
action: StartRegistrationAction.Internal.ReceiveCaptchaToken,
) {
when (val result = action.tokenResult) {
is CaptchaCallbackTokenResult.MissingToken -> {
mutableStateFlow.update {
it.copy(
dialog = StartRegistrationDialog.Error(
BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.captcha_failed.asText(),
),
),
)
}
}
is CaptchaCallbackTokenResult.Success -> {
submitRegisterAccountRequest(
shouldCheckForDataBreaches = false,
shouldIgnorePasswordStrength = true,
captchaToken = result.token,
)
}
}
}
private fun handleEnvironmentTypeSelect(action: StartRegistrationAction.EnvironmentTypeSelect) {
val environment = when (action.environmentType) {
Environment.Type.US -> Environment.Us
Environment.Type.EU -> Environment.Eu
Environment.Type.SELF_HOSTED -> {
// Launch the self-hosted screen and select the full environment details there.
sendEvent(StartRegistrationEvent.NavigateToEnvironment)
return
}
}
// Update the environment in the repo; the VM state will update accordingly because it is
// listening for changes.
environmentRepository.environment = environment
}
private fun handleUpdatedEnvironmentReceive(
action: StartRegistrationAction.Internal.UpdatedEnvironmentReceive,
) {
mutableStateFlow.update {
it.copy(
selectedEnvironmentType = action.environment.type,
)
}
}
private fun handlePrivacyPolicyClick() = sendEvent(StartRegistrationEvent.NavigateToPrivacyPolicy)
private fun handleTermsClick() = sendEvent(StartRegistrationEvent.NavigateToTerms)
private fun handleUnsubscribeMarketingEmailsClick() = sendEvent(StartRegistrationEvent.NavigateToUnsubscribe)
private fun handleReceiveMarketingEmailsToggle(action: StartRegistrationAction.ReceiveMarketingEmailsToggle) {
mutableStateFlow.update {
it.copy(isReceiveMarketingEmailsToggled = action.newState)
}
}
private fun handleDialogDismiss() {
mutableStateFlow.update {
it.copy(dialog = null)
}
}
private fun handleCloseClick() {
sendEvent(StartRegistrationEvent.NavigateBack)
}
private fun handleEmailInputChanged(action: EmailInputChange) {
mutableStateFlow.update {
it.copy(
emailInput = action.input,
isContinueButtonEnabled = action.input.isNotBlank() && state.nameInput.isNotBlank()
)
}
}
private fun handleNameInputChanged(action: NameInputChange) {
mutableStateFlow.update {
it.copy(
nameInput = action.input,
isContinueButtonEnabled = action.input.isNotBlank() && state.emailInput.isNotBlank()
)
}
}
private fun handleContinueClick() = when {
state.emailInput.isBlank() -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.validation_field_required
.asText(R.string.email_address.asText()),
)
mutableStateFlow.update { it.copy(dialog = StartRegistrationDialog.Error(dialog)) }
}
!state.emailInput.isValidEmail() -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.invalid_email.asText(),
)
mutableStateFlow.update { it.copy(dialog = StartRegistrationDialog.Error(dialog)) }
}
state.nameInput.isBlank() -> {
val dialog = BasicDialogState.Shown(
title = R.string.an_error_has_occurred.asText(),
message = R.string.validation_field_required
.asText(R.string.name.asText()),
)
mutableStateFlow.update { it.copy(dialog = StartRegistrationDialog.Error(dialog)) }
}
else -> {
// TODO Call to send verification email
/*
submitRegisterAccountRequest(
shouldCheckForDataBreaches = state.isCheckDataBreachesToggled,
shouldIgnorePasswordStrength = false,
captchaToken = null,
)
*/
viewModelScope.launch {
if (environmentRepository.environment.type == Environment.Type.US || environmentRepository.environment.type == Environment.Type.EU)
sendEvent(StartRegistrationEvent.NavigateToCheckEmail(
email = state.emailInput
))
else
sendEvent(StartRegistrationEvent.NavigateToCompleteRegistration(
email = state.emailInput,
verificationToken = "",
captchaToken = ""
))
}
}
}
private fun submitRegisterAccountRequest(
shouldCheckForDataBreaches: Boolean,
shouldIgnorePasswordStrength: Boolean,
captchaToken: String?,
) {
mutableStateFlow.update {
it.copy(dialog = StartRegistrationDialog.Loading)
}
viewModelScope.launch {
// TODO change to send email service call
/*
val result = authRepository.register(
email = state.emailInput,
captchaToken = captchaToken,
)
sendAction(
StartRegistrationAction.Internal.ReceiveRegisterResult(
registerResult = result,
),
)*/
}
}
}
/**
* UI state for the start registration screen.
*/
@Parcelize
data class StartRegistrationState(
val emailInput: String,
val nameInput: String,
val isReceiveMarketingEmailsToggled: Boolean,
val isContinueButtonEnabled: Boolean,
val selectedEnvironmentType: Environment.Type,
val dialog: StartRegistrationDialog?
) : Parcelable {
}
/**
* Models dialogs that can be displayed on the start registration screen.
*/
sealed class StartRegistrationDialog : Parcelable {
/**
* Loading dialog.
*/
@Parcelize
data object Loading : StartRegistrationDialog()
/**
* General error dialog with an OK button.
*/
@Parcelize
data class Error(val state: BasicDialogState.Shown) : StartRegistrationDialog()
}
/**
* Models events for the start registration screen.
*/
sealed class StartRegistrationEvent {
/**
* Navigate back to previous screen.
*/
data object NavigateBack : StartRegistrationEvent()
/**
* Placeholder event for showing a toast. Can be removed once there are real events.
*/
data class ShowToast(val text: String) : StartRegistrationEvent()
/**
* Navigates to the captcha verification screen.
*/
data class NavigateToCaptcha(val uri: Uri) : StartRegistrationEvent()
/**
* Navigates to the complete registration screen.
*/
data class NavigateToCompleteRegistration(
val email: String,
val verificationToken: String,
val captchaToken: String,
) : StartRegistrationEvent()
/**
* Navigates to the complete registration screen.
*/
data class NavigateToCheckEmail(
val email: String
) : StartRegistrationEvent()
/**
* Navigate to terms and conditions.
*/
data object NavigateToTerms : StartRegistrationEvent()
/**
* Navigate to privacy policy.
*/
data object NavigateToPrivacyPolicy : StartRegistrationEvent()
/**
* Navigate to unsubscribe to marketing emails.
*/
data object NavigateToUnsubscribe: StartRegistrationEvent()
/**
* Navigates to the self-hosted/custom environment screen.
*/
data object NavigateToEnvironment : StartRegistrationEvent()
}
/**
* Models actions for the start registration screen.
*/
sealed class StartRegistrationAction {
/**
* User clicked submit.
*/
data object ContinueClick : StartRegistrationAction()
/**
* User clicked close.
*/
data object CloseClick : StartRegistrationAction()
/**
* Email input changed.
*/
data class EmailInputChange(val input: String) : StartRegistrationAction()
/**
* Name input changed.
*/
data class NameInputChange(val input: String) : StartRegistrationAction()
/**
* Indicates that the selection from the region drop down has changed.
*/
data class EnvironmentTypeSelect(
val environmentType: Environment.Type,
) : StartRegistrationAction()
/**
* User dismissed the error dialog.
*/
data object ErrorDialogDismiss : StartRegistrationAction()
/**
* User tapped receive marketing emails toggle.
*/
data class ReceiveMarketingEmailsToggle(val newState: Boolean) : StartRegistrationAction()
/**
* User tapped privacy policy link.
*/
data object PrivacyPolicyClick : StartRegistrationAction()
/**
* User tapped terms link.
*/
data object TermsClick : StartRegistrationAction()
/**
* User tapped the unsubscribe link.
*/
data object UnsubscribeMarketingEmailsClick : StartRegistrationAction()
/**
* Models actions that the [StartRegistrationViewModel] itself might send.
*/
sealed class Internal : StartRegistrationAction() {
/**
* Indicates a captcha callback token has been received.
*/
data class ReceiveCaptchaToken(
val tokenResult: CaptchaCallbackTokenResult,
) : Internal()
/**
* Indicates a [RegisterResult] has been received.
*/
data class ReceiveRegisterResult(
val registerResult: RegisterResult,
) : Internal()
/**
* Indicates that there has been a change in [environment].
*/
data class UpdatedEnvironmentReceive(
val environment: Environment,
) : Internal()
}
}

View File

@@ -0,0 +1,110 @@
package com.x8bit.bitwarden.ui.platform.components.dropdown
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.platform.repository.model.Environment
import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog
import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow
import com.x8bit.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.x8bit.bitwarden.ui.platform.util.displayLabel
/**
* A dropdown selector UI component specific to region url selection.
*
* This composable displays a dropdown menu allowing users to select a region
* from a list of options. When an option is selected, it invokes the provided callback
* and displays the currently selected region on the UI.
*
* @param labelText The text displayed near the selector button.
* @param selectedOption The currently selected environment option.
* @param onOptionSelected A callback that gets invoked when an environment option is selected
* and passes the selected option as an argument.
* @param modifier A [Modifier] for the composable.
*
*/
@Composable
fun EnvironmentSelector(
labelText: String,
selectedOption: Environment.Type,
onOptionSelected: (Environment.Type) -> Unit,
modifier: Modifier = Modifier,
) {
val options = Environment.Type.entries.toTypedArray()
var shouldShowDialog by rememberSaveable { mutableStateOf(false) }
Box(modifier = modifier) {
Row(
modifier = Modifier
.clip(RoundedCornerShape(28.dp))
.clickable(
indication = rememberRipple(
bounded = true,
color = MaterialTheme.colorScheme.primary,
),
interactionSource = remember { MutableInteractionSource() },
onClick = { shouldShowDialog = !shouldShowDialog },
)
.padding(
vertical = 8.dp,
horizontal = 16.dp,
),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = labelText,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(end = 12.dp),
)
Text(
text = selectedOption.displayLabel(),
style = MaterialTheme.typography.labelLarge,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(end = 8.dp),
)
Icon(
painter = rememberVectorPainter(id = R.drawable.ic_region_select_dropdown),
contentDescription = stringResource(id = R.string.region),
tint = MaterialTheme.colorScheme.primary,
)
}
if (shouldShowDialog) {
BitwardenSelectionDialog(
title = stringResource(id = R.string.logging_in_on),
onDismissRequest = { shouldShowDialog = false },
) {
options.forEach {
BitwardenSelectionRow(
text = it.displayLabel,
onClick = {
onOptionSelected.invoke(it)
shouldShowDialog = false
},
isSelected = it == selectedOption,
)
}
}
}
}
}

View File

@@ -18,6 +18,7 @@ import androidx.navigation.navOptions
import com.x8bit.bitwarden.ui.auth.feature.auth.AUTH_GRAPH_ROUTE
import com.x8bit.bitwarden.ui.auth.feature.auth.authGraph
import com.x8bit.bitwarden.ui.auth.feature.auth.navigateToAuthGraph
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.navigateToCompleteRegistration
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.RESET_PASSWORD_ROUTE
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.navigateToResetPasswordGraph
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.resetPasswordDestination
@@ -95,7 +96,8 @@ fun RootNavScreen(
}
val targetRoute = when (state) {
RootNavState.Auth -> AUTH_GRAPH_ROUTE
RootNavState.Auth,
is RootNavState.CompleteOngoingRegistration-> AUTH_GRAPH_ROUTE
RootNavState.ResetPassword -> RESET_PASSWORD_ROUTE
RootNavState.SetPassword -> SET_PASSWORD_ROUTE
RootNavState.Splash -> SPLASH_ROUTE
@@ -192,6 +194,11 @@ fun RootNavScreen(
navOptions = rootNavOptions,
)
}
is RootNavState.CompleteOngoingRegistration -> {
navController.navigateToAuthGraph(rootNavOptions)
navController.navigateToCompleteRegistration()
}
}
}
}

View File

@@ -2,6 +2,7 @@ package com.x8bit.bitwarden.ui.platform.feature.rootnav
import android.os.Parcelable
import androidx.lifecycle.viewModelScope
import com.google.firebase.Timestamp
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
@@ -60,6 +61,7 @@ class RootNavViewModel @Inject constructor(
action: RootNavAction.Internal.UserStateUpdateReceive,
) {
val userState = action.userState
val specialCircumstance = action.specialCircumstance
val updatedRootNavState = when {
userState?.activeAccount?.trustedDevice?.isDeviceTrusted == false &&
!userState.activeAccount.isVaultUnlocked &&
@@ -69,12 +71,21 @@ class RootNavViewModel @Inject constructor(
userState?.activeAccount?.needsPasswordReset == true -> RootNavState.ResetPassword
specialCircumstance is SpecialCircumstance.CompleteRegistration -> {
RootNavState.CompleteOngoingRegistration(
email = specialCircumstance.completeRegistrationData.email,
verificationToken = specialCircumstance.completeRegistrationData.verificationToken,
timestamp = specialCircumstance.timestamp
)
}
userState == null ||
!userState.activeAccount.isLoggedIn ||
userState.hasPendingAccountAddition -> RootNavState.Auth
userState.activeAccount.isVaultUnlocked -> {
when (val specialCircumstance = action.specialCircumstance) {
when (specialCircumstance) {
is SpecialCircumstance.AutofillSave -> {
RootNavState.VaultUnlockedForAutofillSave(
autofillSaveItem = specialCircumstance.autofillSaveItem,
@@ -105,6 +116,13 @@ class RootNavViewModel @Inject constructor(
SpecialCircumstance.VaultShortcut,
null,
-> RootNavState.VaultUnlocked(activeUserId = userState.activeAccount.userId)
is SpecialCircumstance.CompleteRegistration ->
RootNavState.CompleteOngoingRegistration (
email = specialCircumstance.completeRegistrationData.email,
verificationToken = specialCircumstance.completeRegistrationData.verificationToken,
timestamp = specialCircumstance.timestamp
)
}
}
@@ -200,6 +218,16 @@ sealed class RootNavState : Parcelable {
@Parcelize
data object VaultUnlockedForNewSend : RootNavState()
/**
* App should show the screen to complete an ongoing registration process.
*/
@Parcelize
data class CompleteOngoingRegistration (
val email: String,
val verificationToken: String,
val timestamp: Timestamp
) : RootNavState()
/**
* App should show the auth confirmation screen for an unlocked user.
*/

View File

@@ -34,7 +34,7 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.auth.feature.createaccount.PasswordStrengthIndicator
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledTonalButton

View File

@@ -15,7 +15,7 @@ import com.x8bit.bitwarden.data.vault.datasource.network.model.PolicyTypeJson
import com.x8bit.bitwarden.data.vault.manager.FileManager
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult
import com.x8bit.bitwarden.ui.auth.feature.createaccount.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.Text
import com.x8bit.bitwarden.ui.platform.base.util.asText

View File

@@ -0,0 +1,84 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="413dp"
android:height="114dp"
android:viewportWidth="413"
android:viewportHeight="114">
<group>
<clip-path
android:pathData="M134.84,0.57h143.82v112.71h-143.82z"/>
<path
android:pathData="M260.14,44.62V59.04M192.86,14.74L201.04,8.64C204.02,6.42 208.12,6.45 211.07,8.73L212.84,10.09M164.61,35.82L156.15,42.14C154.05,43.7 152.82,46.17 152.82,48.79V100.48C152.82,105.07 156.53,108.78 161.11,108.78H251.85C256.43,108.78 260.14,105.07 260.14,100.48V71.05"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M165.38,54.52V17.83C165.38,16.3 166.61,15.07 168.14,15.07H206.8"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M175.32,27.21H194.11"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M175.32,38.39H193.56"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M175.32,49.57H196.57"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M175.32,60.75H203.13"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M257.86,106.5L223.49,74.77C220.93,72.41 217.59,71.1 214.11,71.1H197.24C193.65,71.1 190.2,72.5 187.62,75L155.1,106.5"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"/>
<path
android:pathData="M220.36,71.58L231.04,65.46"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M153.86,48.45L192.59,71.58"
android:strokeWidth="2.77"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M260.35,35.09C260.35,51.78 246.82,65.3 230.13,65.3C213.45,65.3 199.92,51.78 199.92,35.09C199.92,18.4 213.45,4.88 230.13,4.88C246.82,4.88 260.35,18.4 260.35,35.09Z"
android:strokeLineJoin="round"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M256.3,35.09C256.3,49.44 244.53,61.07 230.02,61.07M230.02,9.11C215.5,9.11 203.73,20.74 203.73,35.09"
android:strokeLineJoin="round"
android:strokeWidth="1.38289"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
<path
android:pathData="M254.25,53.55L258.87,58.17L276.21,75.51C277.56,76.86 277.56,79.05 276.21,80.4L275.49,81.12C274.14,82.47 271.95,82.47 270.6,81.12L253.26,63.78L248.64,59.16"
android:strokeLineJoin="round"
android:strokeWidth="2.76577"
android:fillColor="#00000000"
android:strokeColor="#175DDC"
android:strokeLineCap="round"/>
</group>
</vector>

View File

@@ -913,4 +913,15 @@ Do you want to switch to this account?</string>
<string name="passkey_operation_failed_because_of_missing_asset_links">Passkey operation failed because of missing asset links</string>
<string name="passkey_operation_failed_because_app_not_found_in_asset_links">Passkey operation failed because app not found in asset links</string>
<string name="passkey_operation_failed_because_app_could_not_be_verified">Passkey operation failed because app could not be verified</string>
<string name="creating_on">Creating on:</string>
<string name="follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account">Follow the instructions in the email sent to %1$s to continue creating your account.</string>
<string name="by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy">By continuing, you agree to the Terms of Service and Privacy Policy</string>
<string name="set_password">Set password</string>
<string name="unsubscribe">Unsubscribe</string>
<string name="check_your_email">Check your email</string>
<string name="open_email_app">Open email app</string>
<string name="go_back">Go back</string>
<string name="no_email_go_back_to_edit_your_email_address">No email? Go back to edit your email address.</string>
<string name="or_log_in_you_may_already_have_an_account">Or log in, you may already have an account.</string>
<string name="get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time">Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time.</string>
</resources>

View File

@@ -17,6 +17,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import androidx.core.net.toUri
import com.x8bit.bitwarden.data.platform.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.AcceptPoliciesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CheckDataBreachesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CloseClick

View File

@@ -14,6 +14,7 @@ import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult
import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult
import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.AcceptPoliciesToggle
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CloseClick
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.ConfirmPasswordInputChange

View File

@@ -49,6 +49,7 @@ class LandingScreenTest : BaseComposeTest() {
private var onNavigateToCreateAccountCalled = false
private var onNavigateToLoginCalled = false
private var onNavigateToEnvironmentCalled = false
private var onNavigateToStartRegistrationCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<LandingEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
private val viewModel = mockk<LandingViewModel>(relaxed = true) {
@@ -66,6 +67,7 @@ class LandingScreenTest : BaseComposeTest() {
onNavigateToLoginCalled = true
},
onNavigateToEnvironment = { onNavigateToEnvironmentCalled = true },
onNavigateToStartRegistration = { onNavigateToStartRegistrationCalled = true },
viewModel = viewModel,
)
}

View File

@@ -15,7 +15,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import com.x8bit.bitwarden.data.platform.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.auth.feature.createaccount.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.ExportVaultFormat

View File

@@ -19,7 +19,7 @@ import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockPolicy
import com.x8bit.bitwarden.data.vault.manager.FileManager
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.ExportVaultDataResult
import com.x8bit.bitwarden.ui.auth.feature.createaccount.PasswordStrengthState
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.ExportVaultFormat