diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/network/model/SyncResponseJson.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/network/model/SyncResponseJson.kt index 384e2599f7..a476fa6724 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/network/model/SyncResponseJson.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/network/model/SyncResponseJson.kt @@ -731,13 +731,13 @@ data class SyncResponseJson( @Serializable data class SshKey( @SerialName("publicKey") - val publicKey: String?, + val publicKey: String, @SerialName("privateKey") - val privateKey: String?, + val privateKey: String, @SerialName("keyFingerprint") - val keyFingerprint: String?, + val keyFingerprint: String, ) /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt index bac0d17c53..505ccb8e33 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt @@ -53,58 +53,52 @@ fun VaultItemSshKeyContent( ) } - sshKeyItemState.publicKey?.let { publicKey -> - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenTextField( - label = stringResource(id = R.string.public_key), - value = publicKey, - onValueChange = { }, - singleLine = false, - readOnly = true, - modifier = Modifier - .testTag("SshKeyItemPublicKeyEntry") - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) - } + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenTextField( + label = stringResource(id = R.string.public_key), + value = sshKeyItemState.publicKey, + onValueChange = { }, + singleLine = false, + readOnly = true, + modifier = Modifier + .testTag("SshKeyItemPublicKeyEntry") + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) } - sshKeyItemState.privateKey?.let { privateKey -> - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenPasswordField( - label = stringResource(id = R.string.private_key), - value = privateKey, - onValueChange = { }, - singleLine = false, - readOnly = true, - showPassword = sshKeyItemState.showPrivateKey, - showPasswordTestTag = "ViewPrivateKeyButton", - showPasswordChange = vaultSshKeyItemTypeHandlers.onShowPrivateKeyClick, - modifier = Modifier - .testTag("SshKeyItemPrivateKeyEntry") - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) - } + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenPasswordField( + label = stringResource(id = R.string.private_key), + value = sshKeyItemState.privateKey, + onValueChange = { }, + singleLine = false, + readOnly = true, + showPassword = sshKeyItemState.showPrivateKey, + showPasswordTestTag = "ViewPrivateKeyButton", + showPasswordChange = vaultSshKeyItemTypeHandlers.onShowPrivateKeyClick, + modifier = Modifier + .testTag("SshKeyItemPrivateKeyEntry") + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) } - sshKeyItemState.fingerprint?.let { fingerprint -> - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenTextField( - label = stringResource(id = R.string.fingerprint), - value = fingerprint, - onValueChange = { }, - singleLine = false, - readOnly = true, - modifier = Modifier - .testTag("SshKeyItemFingerprintEntry") - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) - } + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenTextField( + label = stringResource(id = R.string.fingerprint), + value = sshKeyItemState.fingerprint, + onValueChange = { }, + singleLine = false, + readOnly = true, + modifier = Modifier + .testTag("SshKeyItemFingerprintEntry") + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) } item { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index 72063980c4..0168b289db 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -1410,9 +1410,9 @@ data class VaultItemState( */ data class SshKey( val name: String?, - val publicKey: String?, - val privateKey: String?, - val fingerprint: String?, + val publicKey: String, + val privateKey: String, + val fingerprint: String, val showPrivateKey: Boolean, ) : ItemType() } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt index 37a3213371..879701c60f 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt @@ -995,9 +995,9 @@ data class VaultState( override val extraIconList: List = emptyList(), override val overflowOptions: List, override val shouldShowMasterPasswordReprompt: Boolean, - val publicKey: Text?, - val privateKey: Text?, - val fingerprint: Text?, + val publicKey: Text, + val privateKey: Text, + val fingerprint: Text, ) : VaultItem() { override val supportingLabel: Text? get() = null } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt index 78b4ea8528..efcf83e7df 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt @@ -74,9 +74,9 @@ private fun VaultAddEditState.ViewState.Content.ItemType.toCipherType(): CipherT private fun VaultAddEditState.ViewState.Content.ItemType.toSshKeyView(): SshKeyView? = (this as? VaultAddEditState.ViewState.Content.ItemType.SshKey)?.let { SshKeyView( - publicKey = it.publicKey.orNullIfBlank(), - privateKey = it.privateKey.orNullIfBlank(), - fingerprint = it.fingerprint.orNullIfBlank(), + publicKey = it.publicKey, + privateKey = it.privateKey, + fingerprint = it.fingerprint, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt index b4acd88600..4cc2f95025 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt @@ -276,13 +276,16 @@ private fun CipherView.toVaultItemOrNull( name = name.asText(), publicKey = sshKey ?.publicKey - ?.asText(), + .orEmpty() + .asText(), privateKey = sshKey ?.privateKey - ?.asText(), + .orEmpty() + .asText(), fingerprint = sshKey ?.fingerprint - ?.asText(), + .orEmpty() + .asText(), overflowOptions = toOverflowActions( hasMasterPassword = hasMasterPassword, isPremiumUser = isPremiumUser, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 22d67c1d41..07f9dd1292 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -2151,12 +2151,6 @@ class VaultItemScreenTest : BaseComposeTest() { val publicKey = "the public key" mutableStateFlow.update { it.copy(viewState = DEFAULT_SSH_KEY_VIEW_STATE) } composeTestRule.onNodeWithTextAfterScroll(publicKey).assertIsDisplayed() - - mutableStateFlow.update { currentState -> - updateSshKeyType(currentState) { copy(publicKey = null) } - } - - composeTestRule.assertScrollableNodeDoesNotExist(publicKey) } @Test @@ -2173,12 +2167,6 @@ class VaultItemScreenTest : BaseComposeTest() { composeTestRule .onNodeWithText(privateKey) .assertIsDisplayed() - - mutableStateFlow.update { currentState -> - updateSshKeyType(currentState) { copy(privateKey = null) } - } - - composeTestRule.assertScrollableNodeDoesNotExist(privateKey) } @Test @@ -2205,12 +2193,6 @@ class VaultItemScreenTest : BaseComposeTest() { val fingerprint = "the fingerprint" mutableStateFlow.update { it.copy(viewState = DEFAULT_SSH_KEY_VIEW_STATE) } composeTestRule.onNodeWithTextAfterScroll(fingerprint).assertIsDisplayed() - - mutableStateFlow.update { currentState -> - updateSshKeyType(currentState) { copy(fingerprint = null) } - } - - composeTestRule.assertScrollableNodeDoesNotExist(fingerprint) } //endregion ssh key diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt index c07c298794..6b0d0c0cbe 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt @@ -75,9 +75,9 @@ fun createIdentityView(isEmpty: Boolean): IdentityView = fun createSshKeyView(isEmpty: Boolean): SshKeyView = SshKeyView( - privateKey = "privateKey".takeUnless { isEmpty }, - publicKey = "publicKey".takeUnless { isEmpty }, - fingerprint = "fingerprint".takeUnless { isEmpty }, + privateKey = "privateKey".takeUnless { isEmpty }.orEmpty(), + publicKey = "publicKey".takeUnless { isEmpty }.orEmpty(), + fingerprint = "fingerprint".takeUnless { isEmpty }.orEmpty(), ) fun createCipherView(type: CipherType, isEmpty: Boolean): CipherView = @@ -154,7 +154,7 @@ fun createCipherView(type: CipherType, isEmpty: Boolean): CipherView = creationDate = Instant.ofEpochSecond(1_000L), deletedDate = null, revisionDate = Instant.ofEpochSecond(1_000L), - sshKey = createSshKeyView(isEmpty = isEmpty), + sshKey = createSshKeyView(isEmpty), ) fun createCommonContent( @@ -272,8 +272,8 @@ fun createIdentityContent( fun createSshKeyContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemType.SshKey = VaultItemState.ViewState.Content.ItemType.SshKey( name = "mockName".takeUnless { isEmpty }, - privateKey = "privateKey".takeUnless { isEmpty }, - publicKey = "publicKey".takeUnless { isEmpty }, - fingerprint = "fingerprint".takeUnless { isEmpty }, + privateKey = "privateKey".takeUnless { isEmpty }.orEmpty(), + publicKey = "publicKey".takeUnless { isEmpty }.orEmpty(), + fingerprint = "fingerprint".takeUnless { isEmpty }.orEmpty(), showPrivateKey = false, ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt index 17e257de1c..21540694f2 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt @@ -906,9 +906,9 @@ class VaultDataExtensionsTest { folderId = null, sshKey = createMockSshKeyView(number = 1) .copy( - publicKey = null, - privateKey = null, - fingerprint = null, + publicKey = "publicKey", + privateKey = "privateKey", + fingerprint = "fingerprint", ), ), createMockCipherView( @@ -945,16 +945,16 @@ class VaultDataExtensionsTest { createMockSshKeyVaultItem(number = 1), createMockSshKeyVaultItem(number = 2) .copy( - publicKey = null, - privateKey = null, - fingerprint = null, + publicKey = "publicKey".asText(), + privateKey = "privateKey".asText(), + fingerprint = "fingerprint".asText(), shouldShowMasterPasswordReprompt = true, ), createMockSshKeyVaultItem(number = 3) .copy( - publicKey = null, - privateKey = null, - fingerprint = null, + publicKey = "".asText(), + privateKey = "".asText(), + fingerprint = "".asText(), ), ), trashItemsCount = 0, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a652db318a..f70d28209c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ androidxSplash = "1.1.0-rc01" androidXAppCompat = "1.7.0" androdixAutofill = "1.1.0" androidxWork = "2.9.1" -bitwardenSdk = "1.0.0-20241024.173753-4" +bitwardenSdk = "1.0.0-20241030.101847-8" crashlytics = "3.0.2" detekt = "1.23.7" firebaseBom = "33.5.1"