From ae5830348186d12be282a5ec5b9522c2b5b53af4 Mon Sep 17 00:00:00 2001 From: Ramsey Smith <142836716+ramsey-livefront@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:00:49 -0600 Subject: [PATCH] BIT-2233: Hide master password reprompt on add edit screen (#1265) --- .../feature/addedit/VaultAddEditCardItems.kt | 47 ++++++++++--------- .../addedit/VaultAddEditIdentityItems.kt | 46 +++++++++--------- .../feature/addedit/VaultAddEditLoginItems.kt | 47 ++++++++++--------- .../addedit/VaultAddEditSecureNotesItems.kt | 46 +++++++++--------- .../feature/addedit/VaultAddEditViewModel.kt | 1 + .../addedit/util/CipherViewExtensions.kt | 2 + .../feature/addedit/VaultAddEditScreenTest.kt | 16 +++++++ 7 files changed, 115 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt index eea7d11f69..477f3e7e6b 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt @@ -198,29 +198,30 @@ fun LazyListScope.vaultAddEditCardItems( .padding(horizontal = 16.dp), ) } - - item { - Spacer(modifier = Modifier.height(16.dp)) - BitwardenSwitchWithActions( - label = stringResource(id = R.string.password_prompt), - isChecked = commonState.masterPasswordReprompt, - onCheckedChange = commonHandlers.onToggleMasterPasswordReprompt, - modifier = Modifier - .semantics { testTag = "MasterPasswordRepromptToggle" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - actions = { - IconButton(onClick = commonHandlers.onTooltipClick) { - Icon( - painter = painterResource(id = R.drawable.ic_tooltip), - tint = MaterialTheme.colorScheme.onSurface, - contentDescription = stringResource( - id = R.string.master_password_re_prompt_help, - ), - ) - } - }, - ) + if (commonState.isUnlockWithPasswordEnabled) { + item { + Spacer(modifier = Modifier.height(16.dp)) + BitwardenSwitchWithActions( + label = stringResource(id = R.string.password_prompt), + isChecked = commonState.masterPasswordReprompt, + onCheckedChange = commonHandlers.onToggleMasterPasswordReprompt, + modifier = Modifier + .semantics { testTag = "MasterPasswordRepromptToggle" } + .fillMaxWidth() + .padding(horizontal = 16.dp), + actions = { + IconButton(onClick = commonHandlers.onTooltipClick) { + Icon( + painter = painterResource(id = R.drawable.ic_tooltip), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = stringResource( + id = R.string.master_password_re_prompt_help, + ), + ) + } + }, + ) + } } item { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt index ed2d267d2f..e30d734e32 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt @@ -315,28 +315,30 @@ fun LazyListScope.vaultAddEditIdentityItems( ) } - item { - Spacer(modifier = Modifier.height(16.dp)) - BitwardenSwitchWithActions( - label = stringResource(id = R.string.password_prompt), - isChecked = commonState.masterPasswordReprompt, - onCheckedChange = commonTypeHandlers.onToggleMasterPasswordReprompt, - modifier = Modifier - .semantics { testTag = "MasterPasswordRepromptToggle" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - actions = { - IconButton(onClick = commonTypeHandlers.onTooltipClick) { - Icon( - painter = painterResource(id = R.drawable.ic_tooltip), - tint = MaterialTheme.colorScheme.onSurface, - contentDescription = stringResource( - id = R.string.master_password_re_prompt_help, - ), - ) - } - }, - ) + if (commonState.isUnlockWithPasswordEnabled) { + item { + Spacer(modifier = Modifier.height(16.dp)) + BitwardenSwitchWithActions( + label = stringResource(id = R.string.password_prompt), + isChecked = commonState.masterPasswordReprompt, + onCheckedChange = commonTypeHandlers.onToggleMasterPasswordReprompt, + modifier = Modifier + .semantics { testTag = "MasterPasswordRepromptToggle" } + .fillMaxWidth() + .padding(horizontal = 16.dp), + actions = { + IconButton(onClick = commonTypeHandlers.onTooltipClick) { + Icon( + painter = painterResource(id = R.drawable.ic_tooltip), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = stringResource( + id = R.string.master_password_re_prompt_help, + ), + ) + } + }, + ) + } } item { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt index 887381f607..ecd23b43b9 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt @@ -239,29 +239,30 @@ fun LazyListScope.vaultAddEditLoginItems( .padding(horizontal = 16.dp), ) } - - item { - Spacer(modifier = Modifier.height(16.dp)) - BitwardenSwitchWithActions( - label = stringResource(id = R.string.password_prompt), - isChecked = commonState.masterPasswordReprompt, - onCheckedChange = commonActionHandler.onToggleMasterPasswordReprompt, - modifier = Modifier - .semantics { testTag = "MasterPasswordRepromptToggle" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - actions = { - IconButton(onClick = commonActionHandler.onTooltipClick) { - Icon( - painter = painterResource(id = R.drawable.ic_tooltip), - tint = MaterialTheme.colorScheme.onSurface, - contentDescription = stringResource( - id = R.string.master_password_re_prompt_help, - ), - ) - } - }, - ) + if (commonState.isUnlockWithPasswordEnabled) { + item { + Spacer(modifier = Modifier.height(16.dp)) + BitwardenSwitchWithActions( + label = stringResource(id = R.string.password_prompt), + isChecked = commonState.masterPasswordReprompt, + onCheckedChange = commonActionHandler.onToggleMasterPasswordReprompt, + modifier = Modifier + .semantics { testTag = "MasterPasswordRepromptToggle" } + .fillMaxWidth() + .padding(horizontal = 16.dp), + actions = { + IconButton(onClick = commonActionHandler.onTooltipClick) { + Icon( + painter = painterResource(id = R.drawable.ic_tooltip), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = stringResource( + id = R.string.master_password_re_prompt_help, + ), + ) + } + }, + ) + } } item { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt index 3c5eac58af..e7b327f94c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt @@ -94,28 +94,30 @@ fun LazyListScope.vaultAddEditSecureNotesItems( ) } - item { - Spacer(modifier = Modifier.height(16.dp)) - BitwardenSwitchWithActions( - label = stringResource(id = R.string.password_prompt), - isChecked = commonState.masterPasswordReprompt, - onCheckedChange = commonTypeHandlers.onToggleMasterPasswordReprompt, - modifier = Modifier - .semantics { testTag = "MasterPasswordRepromptToggle" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - actions = { - IconButton(onClick = commonTypeHandlers.onTooltipClick) { - Icon( - painter = painterResource(id = R.drawable.ic_tooltip), - tint = MaterialTheme.colorScheme.onSurface, - contentDescription = stringResource( - id = R.string.master_password_re_prompt_help, - ), - ) - } - }, - ) + if (commonState.isUnlockWithPasswordEnabled) { + item { + Spacer(modifier = Modifier.height(16.dp)) + BitwardenSwitchWithActions( + label = stringResource(id = R.string.password_prompt), + isChecked = commonState.masterPasswordReprompt, + onCheckedChange = commonTypeHandlers.onToggleMasterPasswordReprompt, + modifier = Modifier + .semantics { testTag = "MasterPasswordRepromptToggle" } + .fillMaxWidth() + .padding(horizontal = 16.dp), + actions = { + IconButton(onClick = commonTypeHandlers.onTooltipClick) { + Icon( + painter = painterResource(id = R.drawable.ic_tooltip), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = stringResource( + id = R.string.master_password_re_prompt_help, + ), + ) + } + }, + ) + } } item { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt index af52dbf3be..5e7e3a240a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt @@ -1517,6 +1517,7 @@ data class VaultAddEditState( @IgnoredOnParcel val originalCipher: CipherView? = null, val name: String = "", + val isUnlockWithPasswordEnabled: Boolean = true, val masterPasswordReprompt: Boolean = false, val favorite: Boolean = false, val customFieldData: List = emptyList(), diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt index 4714ffed6a..b74e340c20 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt @@ -128,6 +128,8 @@ fun VaultAddEditState.ViewState.appendFolderAndOwnerData( cipherView = currentContentState.common.originalCipher, isIndividualVaultDisabled = isIndividualVaultDisabled, ), + isUnlockWithPasswordEnabled = + activeAccount.trustedDevice?.hasMasterPassword != false, ), ) } ?: this diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt index d4d9a4e19e..974c53aff9 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt @@ -2107,6 +2107,22 @@ class VaultAddEditScreenTest : BaseComposeTest() { } } + @Test + fun `re-prompt toggle should display according to state`() { + mutableStateFlow.value = DEFAULT_STATE_SECURE_NOTES + + composeTestRule + .onNodeWithTextAfterScroll("Master password re-prompt") + .assertIsDisplayed() + + mutableStateFlow.update { currentState -> + updateCommonContent(currentState) { copy(isUnlockWithPasswordEnabled = false) } + } + composeTestRule + .onNodeWithText("Master password re-prompt") + .assertDoesNotExist() + } + @Test fun `the master password re-prompt toggle should be enabled or disabled according to state`() { mutableStateFlow.value = DEFAULT_STATE_SECURE_NOTES