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