PM-13021: Update empty state for TOTP flow (#4051)

This commit is contained in:
David Perez 2024-10-08 14:20:05 -05:00 committed by GitHub
parent ccb52ae6c5
commit 2af96988ab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 158 additions and 7 deletions

View file

@ -29,6 +29,8 @@ fun VaultItemListingEmpty(
if (state.shouldShowAddButton) { if (state.shouldShowAddButton) {
VaultNoItems( VaultNoItems(
policyDisablesSend = policyDisablesSend, policyDisablesSend = policyDisablesSend,
vectorRes = state.vectorRes,
headerText = state.header(),
message = state.message(), message = state.message(),
buttonText = state.buttonText(), buttonText = state.buttonText(),
modifier = modifier, modifier = modifier,

View file

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.ui.vault.feature.itemlisting package com.x8bit.bitwarden.ui.vault.feature.itemlisting
import android.os.Parcelable import android.os.Parcelable
import androidx.annotation.DrawableRes
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.bitwarden.fido.Fido2CredentialAutofillView import com.bitwarden.fido.Fido2CredentialAutofillView
@ -1559,6 +1560,7 @@ class VaultItemListingViewModel @Inject constructor(
fido2CreationData = state.fido2CredentialRequest, fido2CreationData = state.fido2CredentialRequest,
fido2CredentialAutofillViews = vaultData fido2CredentialAutofillViews = vaultData
.fido2CredentialAutofillViewList, .fido2CredentialAutofillViewList,
totpData = state.totpData,
isPremiumUser = state.isPremium, isPremiumUser = state.isPremium,
) )
} }
@ -1897,9 +1899,11 @@ data class VaultItemListingState(
* Represents a state where the [VaultItemListingScreen] has no items to display. * Represents a state where the [VaultItemListingScreen] has no items to display.
*/ */
data class NoItems( data class NoItems(
val header: Text,
val message: Text, val message: Text,
val shouldShowAddButton: Boolean,
val buttonText: Text, val buttonText: Text,
@DrawableRes val vectorRes: Int = R.drawable.img_vault_items,
val shouldShowAddButton: Boolean,
) : ViewState() { ) : ViewState() {
override val isPullToRefreshEnabled: Boolean get() = true override val isPullToRefreshEnabled: Boolean get() = true
} }

View file

@ -33,6 +33,7 @@ import com.x8bit.bitwarden.ui.vault.feature.util.toOverflowActions
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toFilteredList import com.x8bit.bitwarden.ui.vault.feature.vault.util.toFilteredList
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toLoginIconData import com.x8bit.bitwarden.ui.vault.feature.vault.util.toLoginIconData
import com.x8bit.bitwarden.ui.vault.model.TotpData
import java.time.Clock import java.time.Clock
private const val DELETION_DATE_PATTERN: String = "MMM d, uuuu, hh:mm a" private const val DELETION_DATE_PATTERN: String = "MMM d, uuuu, hh:mm a"
@ -104,6 +105,7 @@ fun VaultData.toViewState(
autofillSelectionData: AutofillSelectionData?, autofillSelectionData: AutofillSelectionData?,
fido2CreationData: Fido2CredentialRequest?, fido2CreationData: Fido2CredentialRequest?,
fido2CredentialAutofillViews: List<Fido2CredentialAutofillView>?, fido2CredentialAutofillViews: List<Fido2CredentialAutofillView>?,
totpData: TotpData?,
isPremiumUser: Boolean, isPremiumUser: Boolean,
): VaultItemListingState.ViewState { ): VaultItemListingState.ViewState {
val filteredCipherViewList = cipherViewList val filteredCipherViewList = cipherViewList
@ -171,6 +173,7 @@ fun VaultData.toViewState(
?.origin ?.origin
?.toHostOrPathOrNull() ?.toHostOrPathOrNull()
?.let { R.string.no_items_for_uri.asText(it) } ?.let { R.string.no_items_for_uri.asText(it) }
?: totpData?.let { R.string.search_for_a_login_or_add_a_new_login.asText() }
?: run { ?: run {
when (itemListingType) { when (itemListingType) {
is VaultItemListingState.ItemListingType.Vault.Folder -> { is VaultItemListingState.ItemListingType.Vault.Folder -> {
@ -197,13 +200,17 @@ fun VaultData.toViewState(
else -> true else -> true
} }
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = totpData
?.let { R.string.no_items_for_uri.asText(it.issuer ?: it.accountName ?: "--") }
?: R.string.save_and_protect_your_data.asText(),
message = message, message = message,
shouldShowAddButton = shouldShowAddButton, shouldShowAddButton = shouldShowAddButton,
buttonText = if (fido2CreationData != null) { buttonText = fido2CreationData
R.string.save_passkey_as_new_login.asText() ?.let { R.string.save_passkey_as_new_login.asText() }
} else { ?: R.string.add_an_item.asText(),
R.string.add_an_item.asText() vectorRes = totpData
}, ?.let { R.drawable.img_folder_question }
?: R.drawable.img_vault_items,
) )
} }
} }
@ -226,6 +233,7 @@ fun List<SendView>.toViewState(
) )
} else { } else {
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),

View file

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.ui.vault.feature.vault package com.x8bit.bitwarden.ui.vault.feature.vault
import android.content.res.Configuration import android.content.res.Configuration
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -34,6 +35,7 @@ fun VaultNoItems(
addItemClickAction: () -> Unit, addItemClickAction: () -> Unit,
policyDisablesSend: Boolean, policyDisablesSend: Boolean,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@DrawableRes vectorRes: Int = R.drawable.img_vault_items,
headerText: String = stringResource(id = R.string.save_and_protect_your_data), headerText: String = stringResource(id = R.string.save_and_protect_your_data),
message: String = stringResource(R.string.the_vault_protects_more_than_just_passwords), message: String = stringResource(R.string.the_vault_protects_more_than_just_passwords),
buttonText: String = stringResource(R.string.new_login), buttonText: String = stringResource(R.string.new_login),
@ -54,7 +56,7 @@ fun VaultNoItems(
Spacer(modifier = Modifier.weight(1F)) Spacer(modifier = Modifier.weight(1F))
Image( Image(
painter = rememberVectorPainter(id = R.drawable.img_vault_items), painter = rememberVectorPainter(id = vectorRes),
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
.standardHorizontalMargin() .standardHorizontalMargin()

View file

@ -0,0 +1,37 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="201dp"
android:viewportWidth="200"
android:viewportHeight="201">
<path
android:fillColor="#79A1E9"
android:pathData="M4.17,44.42C4.17,37.51 9.76,31.92 16.67,31.92H52.58C56.23,31.92 59.7,33.51 62.07,36.28L70.83,46.5H179.17C183.77,46.5 187.5,50.23 187.5,54.83V129.83C187.5,155.15 166.98,175.67 141.67,175.67H14.58C8.83,175.67 4.17,171 4.17,165.25V44.42Z" />
<path
android:fillColor="#175DDC"
android:fillType="evenOdd"
android:pathData="M68.92,50.67L58.91,38.99C57.33,37.15 55.02,36.08 52.58,36.08H16.67C12.06,36.08 8.33,39.81 8.33,44.42V165.25C8.33,168.7 11.13,171.5 14.58,171.5H141.67C164.68,171.5 183.33,152.85 183.33,129.83V54.83C183.33,52.53 181.47,50.67 179.17,50.67H68.92ZM70.83,46.5L62.07,36.28C59.7,33.51 56.23,31.92 52.58,31.92H16.67C9.76,31.92 4.17,37.51 4.17,44.42V165.25C4.17,171 8.83,175.67 14.58,175.67H141.67C166.98,175.67 187.5,155.15 187.5,129.83V54.83C187.5,50.23 183.77,46.5 179.17,46.5H70.83Z" />
<path
android:fillColor="#AAC3EF"
android:pathData="M22.96,83.58C24.15,77.76 29.27,73.58 35.21,73.58H189.79C195.07,73.58 199.01,78.42 197.96,83.58L181.21,165.67C180.02,171.49 174.9,175.67 168.96,175.67H14.37C9.1,175.67 5.15,170.83 6.21,165.67L22.96,83.58Z" />
<path
android:fillColor="#175DDC"
android:fillType="evenOdd"
android:pathData="M189.79,77.75H35.21C31.25,77.75 27.83,80.54 27.04,84.42L10.29,166.5C9.76,169.08 11.74,171.5 14.37,171.5H168.96C172.92,171.5 176.33,168.71 177.13,164.83L193.88,82.75C194.4,80.17 192.43,77.75 189.79,77.75ZM35.21,73.58C29.27,73.58 24.15,77.76 22.96,83.58L6.21,165.67C5.15,170.83 9.1,175.67 14.37,175.67H168.96C174.9,175.67 180.02,171.49 181.21,165.67L197.96,83.58C199.01,78.42 195.07,73.58 189.79,73.58H35.21Z" />
<path
android:fillColor="#F3F6F9"
android:pathData="M175,67.33C175,90.35 156.35,109 133.33,109C110.32,109 91.67,90.35 91.67,67.33C91.67,44.32 110.32,25.67 133.33,25.67C156.35,25.67 175,44.32 175,67.33Z" />
<path
android:fillColor="#175DDC"
android:fillType="evenOdd"
android:pathData="M133.33,104.83C154.04,104.83 170.83,88.04 170.83,67.33C170.83,46.62 154.04,29.83 133.33,29.83C112.62,29.83 95.83,46.62 95.83,67.33C95.83,88.04 112.62,104.83 133.33,104.83ZM133.33,109C156.35,109 175,90.35 175,67.33C175,44.32 156.35,25.67 133.33,25.67C110.32,25.67 91.67,44.32 91.67,67.33C91.67,90.35 110.32,109 133.33,109Z" />
<path
android:fillColor="#FFBF00"
android:pathData="M164.58,67.33C164.58,84.59 150.59,98.58 133.33,98.58C116.07,98.58 102.08,84.59 102.08,67.33C102.08,50.07 116.07,36.08 133.33,36.08C150.59,36.08 164.58,50.07 164.58,67.33Z" />
<path
android:fillColor="#175DDC"
android:pathData="M197.93,127.93L163.54,95.46L159.38,99.62L191.85,134.01C193.46,135.71 196.16,135.75 197.82,134.09L198.01,133.91C199.67,132.25 199.63,129.54 197.93,127.93Z" />
<path
android:fillColor="#175DDC"
android:fillType="evenOdd"
android:pathData="M128.28,71.66C128.31,72.73 129.18,73.58 130.25,73.58H131.36C132.45,73.58 133.34,72.7 133.34,71.61L133.34,69.42C139.21,69.33 143.75,66.08 143.75,60.04C143.75,53.64 139.51,50.67 133.34,50.67C127.94,50.67 123.09,54.23 122.84,59.37C122.79,60.36 123.65,61.08 124.63,61.08H125.11C126.2,61.08 127.05,60.18 127.37,59.14C128.21,56.43 130.77,54.83 133.34,54.83C136.46,54.83 139.06,56.68 139.06,60.04C139.06,65.01 133.72,65.92 129.65,66.06C128.81,66.09 128.15,66.77 128.17,67.6L128.28,71.66ZM130.73,82.96C133.03,82.96 134.9,81.56 134.9,79.83C134.9,78.11 133.03,76.71 130.73,76.71C128.43,76.71 126.56,78.11 126.56,79.83C126.56,81.56 128.43,82.96 130.73,82.96Z" />
</vector>

View file

@ -0,0 +1,37 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="201dp"
android:viewportWidth="200"
android:viewportHeight="201">
<path
android:fillColor="#AAC3EF"
android:pathData="M4.17,44.42C4.17,37.51 9.76,31.92 16.67,31.92H52.58C56.23,31.92 59.7,33.51 62.07,36.28L70.83,46.5H179.17C183.77,46.5 187.5,50.23 187.5,54.83V129.83C187.5,155.15 166.98,175.67 141.67,175.67H14.58C8.83,175.67 4.17,171 4.17,165.25V44.42Z" />
<path
android:fillColor="#020F66"
android:fillType="evenOdd"
android:pathData="M68.92,50.67L58.91,38.99C57.33,37.15 55.02,36.08 52.58,36.08H16.67C12.06,36.08 8.33,39.81 8.33,44.42V165.25C8.33,168.7 11.13,171.5 14.58,171.5H141.67C164.68,171.5 183.33,152.85 183.33,129.83V54.83C183.33,52.53 181.47,50.67 179.17,50.67H68.92ZM70.83,46.5L62.07,36.28C59.7,33.51 56.23,31.92 52.58,31.92H16.67C9.76,31.92 4.17,37.51 4.17,44.42V165.25C4.17,171 8.83,175.67 14.58,175.67H141.67C166.98,175.67 187.5,155.15 187.5,129.83V54.83C187.5,50.23 183.77,46.5 179.17,46.5H70.83Z" />
<path
android:fillColor="#DBE5F6"
android:pathData="M22.96,83.58C24.15,77.76 29.27,73.58 35.21,73.58H189.79C195.07,73.58 199.01,78.42 197.96,83.58L181.21,165.67C180.02,171.49 174.9,175.67 168.96,175.67H14.37C9.1,175.67 5.15,170.83 6.21,165.67L22.96,83.58Z" />
<path
android:fillColor="#020F66"
android:fillType="evenOdd"
android:pathData="M189.79,77.75H35.21C31.25,77.75 27.83,80.54 27.04,84.42L10.29,166.5C9.76,169.08 11.74,171.5 14.37,171.5H168.96C172.92,171.5 176.33,168.71 177.13,164.83L193.88,82.75C194.4,80.17 192.43,77.75 189.79,77.75ZM35.21,73.58C29.27,73.58 24.15,77.76 22.96,83.58L6.21,165.67C5.15,170.83 9.1,175.67 14.37,175.67H168.96C174.9,175.67 180.02,171.49 181.21,165.67L197.96,83.58C199.01,78.42 195.07,73.58 189.79,73.58H35.21Z" />
<path
android:fillColor="#ffffff"
android:pathData="M175,67.33C175,90.35 156.35,109 133.33,109C110.32,109 91.67,90.35 91.67,67.33C91.67,44.32 110.32,25.67 133.33,25.67C156.35,25.67 175,44.32 175,67.33Z" />
<path
android:fillColor="#020F66"
android:fillType="evenOdd"
android:pathData="M133.33,104.83C154.04,104.83 170.83,88.04 170.83,67.33C170.83,46.62 154.04,29.83 133.33,29.83C112.62,29.83 95.83,46.62 95.83,67.33C95.83,88.04 112.62,104.83 133.33,104.83ZM133.33,109C156.35,109 175,90.35 175,67.33C175,44.32 156.35,25.67 133.33,25.67C110.32,25.67 91.67,44.32 91.67,67.33C91.67,90.35 110.32,109 133.33,109Z" />
<path
android:fillColor="#FFBF00"
android:pathData="M164.58,67.33C164.58,84.59 150.59,98.58 133.33,98.58C116.07,98.58 102.08,84.59 102.08,67.33C102.08,50.07 116.07,36.08 133.33,36.08C150.59,36.08 164.58,50.07 164.58,67.33Z" />
<path
android:fillColor="#020F66"
android:pathData="M197.93,127.93L163.54,95.46L159.38,99.62L191.85,134.01C193.46,135.71 196.16,135.75 197.82,134.09L198.01,133.91C199.67,132.25 199.63,129.54 197.93,127.93Z" />
<path
android:fillColor="#020F66"
android:fillType="evenOdd"
android:pathData="M128.28,71.66C128.31,72.73 129.18,73.58 130.25,73.58H131.36C132.45,73.58 133.33,72.7 133.33,71.61L133.33,69.42C139.2,69.33 143.75,66.08 143.75,60.04C143.75,53.64 139.51,50.67 133.33,50.67C127.94,50.67 123.09,54.23 122.83,59.37C122.79,60.36 123.65,61.08 124.63,61.08H125.11C126.2,61.08 127.05,60.18 127.37,59.14C128.21,56.43 130.77,54.83 133.33,54.83C136.46,54.83 139.06,56.68 139.06,60.04C139.06,65.01 133.72,65.92 129.65,66.06C128.81,66.09 128.14,66.77 128.17,67.6L128.28,71.66ZM130.73,82.96C133.03,82.96 134.9,81.56 134.9,79.83C134.9,78.11 133.03,76.71 130.73,76.71C128.43,76.71 126.56,78.11 126.56,79.83C126.56,81.56 128.43,82.96 130.73,82.96Z" />
</vector>

View file

@ -195,6 +195,7 @@
<string name="translations">Translations</string> <string name="translations">Translations</string>
<string name="items_for_uri">Items for %1$s</string> <string name="items_for_uri">Items for %1$s</string>
<string name="no_items_for_uri">There are no items in your vault for %1$s.</string> <string name="no_items_for_uri">There are no items in your vault for %1$s.</string>
<string name="search_for_a_login_or_add_a_new_login">Search for a login or add a new login</string>
<string name="bitwarden_autofill_service_overlay">When you select an input field and see a Bitwarden auto-fill overlay, you can tap it to launch the auto-fill service.</string> <string name="bitwarden_autofill_service_overlay">When you select an input field and see a Bitwarden auto-fill overlay, you can tap it to launch the auto-fill service.</string>
<string name="bitwarden_autofill_service_notification_content">Tap this notification to auto-fill an item from your vault.</string> <string name="bitwarden_autofill_service_notification_content">Tap this notification to auto-fill an item from your vault.</string>
<string name="bitwarden_autofill_service_open_accessibility_settings">Open Accessibility Settings</string> <string name="bitwarden_autofill_service_open_accessibility_settings">Open Accessibility Settings</string>

View file

@ -383,6 +383,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
it.copy( it.copy(
itemListingType = VaultItemListingState.ItemListingType.Send.SendFile, itemListingType = VaultItemListingState.ItemListingType.Send.SendFile,
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no Sends in your account.".asText(), message = "There are no Sends in your account.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -419,6 +420,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -519,6 +521,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -541,6 +544,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -569,6 +573,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -583,6 +588,7 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = false, shouldShowAddButton = false,
buttonText = "Add an Item".asText(), buttonText = "Add an Item".asText(),
@ -599,12 +605,16 @@ class VaultItemListingScreenTest : BaseComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = "Save and protect your data".asText(),
message = "There are no items in your vault.".asText(), message = "There are no items in your vault.".asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = "Save passkey as new login".asText(), buttonText = "Save passkey as new login".asText(),
), ),
) )
} }
composeTestRule
.onNodeWithText(text = "Save and protect your data")
.assertIsDisplayed()
composeTestRule composeTestRule
.onNodeWithText(text = "There are no items in your vault.") .onNodeWithText(text = "There are no items in your vault.")
.assertIsDisplayed() .assertIsDisplayed()

View file

@ -1654,6 +1654,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1681,6 +1682,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1752,6 +1754,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1779,6 +1782,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1862,6 +1866,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1890,6 +1895,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -1974,6 +1980,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -2001,6 +2008,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
assertEquals( assertEquals(
createVaultItemListingState( createVaultItemListingState(
viewState = VaultItemListingState.ViewState.NoItems( viewState = VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),

View file

@ -25,6 +25,7 @@ import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.components.model.IconData import com.x8bit.bitwarden.ui.platform.components.model.IconData
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.model.TotpData
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkStatic import io.mockk.mockkStatic
@ -401,6 +402,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
) )
@ -493,6 +495,7 @@ class VaultItemListingDataExtensionsTest {
), ),
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = fido2CredentialAutofillViews, fido2CredentialAutofillViews = fido2CredentialAutofillViews,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
) )
@ -578,6 +581,7 @@ class VaultItemListingDataExtensionsTest {
), ),
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = fido2CredentialAutofillViews, fido2CredentialAutofillViews = fido2CredentialAutofillViews,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
) )
@ -622,6 +626,7 @@ class VaultItemListingDataExtensionsTest {
// Trash // Trash
assertEquals( assertEquals(
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items_trash.asText(), message = R.string.no_items_trash.asText(),
shouldShowAddButton = false, shouldShowAddButton = false,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -635,6 +640,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
), ),
) )
@ -642,6 +648,7 @@ class VaultItemListingDataExtensionsTest {
// Folders // Folders
assertEquals( assertEquals(
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items_folder.asText(), message = R.string.no_items_folder.asText(),
shouldShowAddButton = false, shouldShowAddButton = false,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -657,6 +664,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
), ),
) )
@ -664,6 +672,7 @@ class VaultItemListingDataExtensionsTest {
// Other ciphers // Other ciphers
assertEquals( assertEquals(
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items.asText(), message = R.string.no_items.asText(),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -677,6 +686,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
), ),
) )
@ -684,6 +694,7 @@ class VaultItemListingDataExtensionsTest {
// Autofill // Autofill
assertEquals( assertEquals(
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items_for_uri.asText("www.test.com"), message = R.string.no_items_for_uri.asText("www.test.com"),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.add_an_item.asText(), buttonText = R.string.add_an_item.asText(),
@ -701,6 +712,7 @@ class VaultItemListingDataExtensionsTest {
), ),
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
), ),
) )
@ -708,6 +720,7 @@ class VaultItemListingDataExtensionsTest {
// Autofill passkey // Autofill passkey
assertEquals( assertEquals(
VaultItemListingState.ViewState.NoItems( VaultItemListingState.ViewState.NoItems(
header = R.string.save_and_protect_your_data.asText(),
message = R.string.no_items_for_uri.asText("www.test.com"), message = R.string.no_items_for_uri.asText("www.test.com"),
shouldShowAddButton = true, shouldShowAddButton = true,
buttonText = R.string.save_passkey_as_new_login.asText(), buttonText = R.string.save_passkey_as_new_login.asText(),
@ -727,6 +740,33 @@ class VaultItemListingDataExtensionsTest {
origin = "https://www.test.com", origin = "https://www.test.com",
), ),
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true,
),
)
// Totp
assertEquals(
VaultItemListingState.ViewState.NoItems(
header = R.string.no_items_for_uri.asText("issuer"),
message = R.string.search_for_a_login_or_add_a_new_login.asText(),
shouldShowAddButton = false,
buttonText = R.string.add_an_item.asText(),
vectorRes = R.drawable.img_folder_question,
),
vaultData.toViewState(
itemListingType = VaultItemListingState.ItemListingType.Vault.Trash,
vaultFilterType = VaultFilterType.AllVaults,
hasMasterPassword = true,
baseIconUrl = Environment.Us.environmentUrlData.baseIconUrl,
isIconLoadingDisabled = false,
autofillSelectionData = null,
fido2CreationData = null,
fido2CredentialAutofillViews = null,
totpData = mockk<TotpData> {
every { accountName } returns "accountName"
every { issuer } returns "issuer"
},
isPremiumUser = true, isPremiumUser = true,
), ),
) )
@ -869,6 +909,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
) )
@ -912,6 +953,7 @@ class VaultItemListingDataExtensionsTest {
autofillSelectionData = null, autofillSelectionData = null,
fido2CreationData = null, fido2CreationData = null,
fido2CredentialAutofillViews = null, fido2CredentialAutofillViews = null,
totpData = null,
isPremiumUser = true, isPremiumUser = true,
) )