diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt index fcb1fed004..eab5ea14f0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.width -import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -19,7 +18,6 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton -import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable @@ -34,6 +32,7 @@ import com.bitwarden.ui.platform.theme.BitwardenTheme fun AttachmentItemContent( attachmentItem: VaultItemState.ViewState.Content.Common.AttachmentItem, onAttachmentDownloadClick: (VaultItemState.ViewState.Content.Common.AttachmentItem) -> Unit, + onUpgradeToPremiumClick: () -> Unit, cardStyle: CardStyle, modifier: Modifier = Modifier, ) { @@ -91,24 +90,17 @@ fun AttachmentItemContent( } if (shouldShowPremiumWarningDialog) { - AlertDialog( + BitwardenTwoButtonDialog( + title = stringResource(id = BitwardenString.attachments_unavailable), + message = stringResource(id = BitwardenString.attachments_are_a_premium_feature), + confirmButtonText = stringResource(id = BitwardenString.upgrade_to_premium), + dismissButtonText = stringResource(id = BitwardenString.cancel), + onConfirmClick = { + shouldShowPremiumWarningDialog = false + onUpgradeToPremiumClick() + }, + onDismissClick = { shouldShowPremiumWarningDialog = false }, onDismissRequest = { shouldShowPremiumWarningDialog = false }, - confirmButton = { - BitwardenTextButton( - label = stringResource(BitwardenString.okay), - onClick = { shouldShowPremiumWarningDialog = false }, - ) - }, - text = { - Text( - text = stringResource(BitwardenString.premium_required), - style = BitwardenTheme.typography.bodyMedium, - ) - }, - containerColor = BitwardenTheme.colorScheme.background.primary, - iconContentColor = BitwardenTheme.colorScheme.icon.secondary, - titleContentColor = BitwardenTheme.colorScheme.text.primary, - textContentColor = BitwardenTheme.colorScheme.text.primary, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt index ffa975c71a..143fd92751 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt @@ -300,6 +300,7 @@ fun VaultItemCardContent( attachmentItem = attachmentItem, onAttachmentDownloadClick = vaultCommonItemTypeHandlers .onAttachmentDownloadClick, + onUpgradeToPremiumClick = vaultCommonItemTypeHandlers.onUpgradeToPremiumClick, cardStyle = attachments.toListItemCardStyle(index = index), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt index 1f1fca648e..6696fdb18c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt @@ -361,6 +361,7 @@ fun VaultItemIdentityContent( attachmentItem = attachmentItem, onAttachmentDownloadClick = vaultCommonItemTypeHandlers .onAttachmentDownloadClick, + onUpgradeToPremiumClick = vaultCommonItemTypeHandlers.onUpgradeToPremiumClick, cardStyle = attachments.toListItemCardStyle(index = index), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt index 0f1d8998c3..322148401a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt @@ -266,6 +266,7 @@ fun VaultItemLoginContent( cardStyle = attachments.toListItemCardStyle(index = index), onAttachmentDownloadClick = vaultCommonItemTypeHandlers .onAttachmentDownloadClick, + onUpgradeToPremiumClick = vaultCommonItemTypeHandlers.onUpgradeToPremiumClick, ) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt index 57ac027b32..d37c204ee2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt @@ -148,6 +148,7 @@ fun VaultItemSecureNoteContent( attachmentItem = attachmentItem, onAttachmentDownloadClick = vaultCommonItemTypeHandlers .onAttachmentDownloadClick, + onUpgradeToPremiumClick = vaultCommonItemTypeHandlers.onUpgradeToPremiumClick, cardStyle = attachments.toListItemCardStyle(index = index), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt index b4ac9d6630..3f35c4955d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt @@ -233,6 +233,7 @@ fun VaultItemSshKeyContent( attachmentItem = attachmentItem, onAttachmentDownloadClick = vaultCommonItemTypeHandlers .onAttachmentDownloadClick, + onUpgradeToPremiumClick = vaultCommonItemTypeHandlers.onUpgradeToPremiumClick, cardStyle = attachments.toListItemCardStyle(index = index), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/handlers/VaultCommonItemTypeHandlers.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/handlers/VaultCommonItemTypeHandlers.kt index b237483df4..d444991ddc 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/handlers/VaultCommonItemTypeHandlers.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/handlers/VaultCommonItemTypeHandlers.kt @@ -19,6 +19,7 @@ data class VaultCommonItemTypeHandlers( val onAttachmentDownloadClick: (VaultItemState.ViewState.Content.Common.AttachmentItem) -> Unit, val onCopyNotesClick: () -> Unit, val onPasswordHistoryClick: () -> Unit, + val onUpgradeToPremiumClick: () -> Unit, ) { @Suppress("UndocumentedPublicClass") companion object { @@ -56,6 +57,9 @@ data class VaultCommonItemTypeHandlers( onPasswordHistoryClick = { viewModel.trySendAction(VaultItemAction.Common.PasswordHistoryClick) }, + onUpgradeToPremiumClick = { + viewModel.trySendAction(VaultItemAction.Common.UpgradeToPremiumClick) + }, ) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 9d2842c88c..2b1a3a9851 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -767,17 +767,21 @@ class VaultItemScreenTest : BitwardenComposeTest() { composeTestRule .onAllNodesWithText( - "A premium membership is required to use this feature.", + text = "Attachments are a Premium feature. " + + "Your current plan does not include access to this feature.", ) .filterToOne(hasAnyAncestor(isDialog())) .assertIsDisplayed() composeTestRule - .onAllNodesWithText(text = "Okay") + .onAllNodesWithText(text = "Upgrade to premium") .filterToOne(hasAnyAncestor(isDialog())) .performClick() composeTestRule.assertNoDialogExists() + verify(exactly = 1) { + viewModel.trySendAction(VaultItemAction.Common.UpgradeToPremiumClick) + } } @Suppress("MaxLineLength") diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 600c962c16..6ac5d66764 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -200,6 +200,8 @@ Scanning will happen automatically. Copy TOTP automatically A premium membership is required to use this feature. Attachment deleted + Attachments unavailable + Attachments are a Premium feature. Your current plan does not include access to this feature. Choose file File No file chosen