[PM-23125] Move authenticator drawables to ui module (#5440)

This commit is contained in:
Patrick Honkonen 2025-06-30 11:55:24 -04:00 committed by GitHub
parent b1dc894fe8
commit 1070c9d46e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
58 changed files with 91 additions and 208 deletions

View File

@ -37,6 +37,7 @@ import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaf
import com.bitwarden.authenticator.ui.platform.composition.LocalBiometricsManager
import com.bitwarden.authenticator.ui.platform.manager.biometrics.BiometricsManager
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.util.asText
/**
@ -131,7 +132,7 @@ fun UnlockScreen(
.height(74.dp)
.fillMaxWidth(),
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary),
painter = painterResource(id = R.drawable.ic_logo_horizontal),
painter = painterResource(id = BitwardenDrawable.ic_logo_horizontal),
contentDescription = stringResource(R.string.bitwarden_authenticator),
)
Spacer(modifier = Modifier.height(32.dp))

View File

@ -1,6 +1,7 @@
package com.bitwarden.authenticator.ui.authenticator.feature.edititem
import android.widget.Toast
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Row
@ -16,6 +17,7 @@ import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FabPosition
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
@ -27,6 +29,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
@ -60,10 +63,8 @@ import com.bitwarden.authenticator.ui.platform.components.stepper.BitwardenStepp
import com.bitwarden.authenticator.ui.platform.components.toggle.BitwardenSwitch
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.standardHorizontalMargin
import com.bitwarden.ui.platform.components.icon.BitwardenIcon
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.util.asText
import kotlinx.collections.immutable.toImmutableList
/**
@ -306,7 +307,11 @@ fun EditItemContent(
)
}
item {
item(key = "AdvancedOptions") {
val iconRotationDegrees = animateFloatAsState(
targetValue = if (viewState.isAdvancedOptionsExpanded) 180f else 0f,
label = "expanderIconRotationAnimation",
)
Spacer(modifier = Modifier.height(16.dp))
Row(
modifier = Modifier
@ -322,7 +327,8 @@ fun EditItemContent(
interactionSource = remember { MutableInteractionSource() },
onClick = onExpandAdvancedOptionsClicked,
)
.padding(vertical = 12.dp),
.padding(vertical = 12.dp)
.animateItem(),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
@ -331,16 +337,16 @@ fun EditItemContent(
color = MaterialTheme.colorScheme.primary,
)
Spacer(Modifier.width(8.dp))
BitwardenIcon(
iconData = IconData.Local(
iconRes = if (viewState.isAdvancedOptionsExpanded) {
R.drawable.ic_chevron_up
} else {
R.drawable.ic_chevron_down
},
contentDescription = R.string.collapse_advanced_options.asText(),
),
Icon(
painter = rememberVectorPainter(id = BitwardenDrawable.ic_chevron_down),
contentDescription = if (viewState.isAdvancedOptionsExpanded) {
stringResource(R.string.collapse_advanced_options)
} else {
stringResource(R.string.expand_advanced_options)
},
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier
.rotate(degrees = iconRotationDegrees.value),
)
}
}

View File

@ -385,7 +385,7 @@ private fun ItemListingContent(
ItemListingExpandableFabAction.ScanQrCode(
label = R.string.scan_a_qr_code.asText(),
icon = IconResource(
iconPainter = painterResource(id = R.drawable.ic_camera),
iconPainter = painterResource(id = BitwardenDrawable.ic_camera),
contentDescription = stringResource(id = R.string.scan_a_qr_code),
testTag = "ScanQRCodeButton",
),
@ -394,7 +394,7 @@ private fun ItemListingContent(
ItemListingExpandableFabAction.EnterSetupKey(
label = R.string.enter_key_manually.asText(),
icon = IconResource(
iconPainter = painterResource(id = R.drawable.ic_keyboard_24px),
iconPainter = painterResource(id = BitwardenDrawable.ic_keyboard),
contentDescription = stringResource(id = R.string.enter_key_manually),
testTag = "EnterSetupKeyButton",
),
@ -403,7 +403,7 @@ private fun ItemListingContent(
),
expandableFabIcon = ExpandableFabIcon(
iconData = IconResource(
iconPainter = painterResource(id = R.drawable.ic_plus),
iconPainter = painterResource(id = BitwardenDrawable.ic_plus),
contentDescription = stringResource(id = R.string.add_item),
testTag = "AddItemButton",
),
@ -608,7 +608,7 @@ fun EmptyItemListingContent(
ItemListingExpandableFabAction.ScanQrCode(
label = R.string.scan_a_qr_code.asText(),
icon = IconResource(
iconPainter = painterResource(id = R.drawable.ic_camera),
iconPainter = painterResource(id = BitwardenDrawable.ic_camera),
contentDescription = stringResource(id = R.string.scan_a_qr_code),
testTag = "ScanQRCodeButton",
),
@ -617,7 +617,7 @@ fun EmptyItemListingContent(
ItemListingExpandableFabAction.EnterSetupKey(
label = R.string.enter_key_manually.asText(),
icon = IconResource(
iconPainter = painterResource(id = R.drawable.ic_keyboard_24px),
iconPainter = painterResource(id = BitwardenDrawable.ic_keyboard),
contentDescription = stringResource(id = R.string.enter_key_manually),
testTag = "EnterSetupKeyButton",
),
@ -626,7 +626,7 @@ fun EmptyItemListingContent(
),
expandableFabIcon = ExpandableFabIcon(
iconData = IconResource(
iconPainter = painterResource(id = R.drawable.ic_plus),
iconPainter = painterResource(id = BitwardenDrawable.ic_plus),
contentDescription = stringResource(id = R.string.add_item),
testTag = "AddItemButton",
),
@ -675,9 +675,9 @@ fun EmptyItemListingContent(
modifier = Modifier.fillMaxWidth(),
painter = painterResource(
id = when (appTheme) {
AppTheme.DARK -> R.drawable.ic_empty_vault_dark
AppTheme.LIGHT -> R.drawable.ic_empty_vault_light
AppTheme.DEFAULT -> R.drawable.ic_empty_vault
AppTheme.DARK -> BitwardenDrawable.ic_empty_vault_dark
AppTheme.LIGHT -> BitwardenDrawable.ic_empty_vault_light
AppTheme.DEFAULT -> BitwardenDrawable.ic_empty_vault
},
),
contentDescription = stringResource(
@ -718,7 +718,7 @@ private fun DownloadBitwardenActionCard(
onDownloadBitwardenClick: () -> Unit,
) = BitwardenActionCard(
modifier = modifier,
actionIcon = rememberVectorPainter(R.drawable.ic_bitwarden),
actionIcon = rememberVectorPainter(BitwardenDrawable.ic_shield),
actionText = stringResource(R.string.download_bitwarden_card_message),
callToActionText = stringResource(R.string.download_now),
titleText = stringResource(R.string.download_bitwarden_card_title),
@ -763,7 +763,7 @@ private fun SyncWithBitwardenActionCard(
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = rememberVectorPainter(id = R.drawable.ic_bitwarden),
painter = rememberVectorPainter(id = BitwardenDrawable.ic_shield),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(size = 20.dp),

View File

@ -38,6 +38,7 @@ import com.bitwarden.authenticator.ui.platform.components.indicator.BitwardenCir
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.components.icon.BitwardenIcon
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* The verification code item displayed to the user.
@ -165,7 +166,7 @@ fun VaultVerificationCodeItem(
},
leadingIcon = {
Icon(
painter = painterResource(id = R.drawable.ic_copy),
painter = painterResource(id = BitwardenDrawable.ic_copy),
contentDescription = stringResource(id = R.string.copy),
)
},
@ -181,7 +182,7 @@ fun VaultVerificationCodeItem(
},
leadingIcon = {
Icon(
painter = painterResource(id = R.drawable.ic_edit_item),
painter = painterResource(id = BitwardenDrawable.ic_edit_item),
contentDescription = stringResource(R.string.edit_item),
)
},
@ -198,7 +199,7 @@ fun VaultVerificationCodeItem(
},
leadingIcon = {
Icon(
painter = painterResource(id = R.drawable.ic_arrow_right),
painter = painterResource(id = BitwardenDrawable.ic_arrow_right),
contentDescription = stringResource(
id = R.string.copy_to_bitwarden_vault,
),
@ -217,7 +218,7 @@ fun VaultVerificationCodeItem(
},
leadingIcon = {
Icon(
painter = painterResource(id = R.drawable.ic_delete_item),
painter = painterResource(id = BitwardenDrawable.ic_delete_item),
contentDescription = stringResource(id = R.string.delete_item),
)
},
@ -238,7 +239,7 @@ private fun VerificationCodeItem_preview() {
periodSeconds = 30,
timeLeftSeconds = 15,
alertThresholdSeconds = 7,
startIcon = IconData.Local(R.drawable.ic_login_item),
startIcon = IconData.Local(BitwardenDrawable.ic_login_item),
onItemClick = {},
onDropdownMenuClick = {},
allowLongPress = true,

View File

@ -1,8 +1,8 @@
package com.bitwarden.authenticator.ui.authenticator.feature.model
import android.os.Parcelable
import com.bitwarden.authenticator.R
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import kotlinx.parcelize.Parcelize
/**
@ -18,7 +18,7 @@ data class VerificationCodeDisplayItem(
val alertThresholdSeconds: Int,
val authCode: String,
val startIcon: IconData = IconData.Local(
iconRes = R.drawable.ic_login_item,
iconRes = BitwardenDrawable.ic_login_item,
testTag = "BitwardenIcon",
),
val favorite: Boolean,

View File

@ -54,6 +54,7 @@ import com.bitwarden.authenticator.ui.platform.feature.settings.navigateToSettin
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.max
import com.bitwarden.ui.platform.base.util.toDp
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.platform.theme.RootTransitionProviders
import com.bitwarden.ui.platform.util.toObjectNavigationRoute
import kotlinx.coroutines.flow.launchIn
@ -306,8 +307,8 @@ private sealed class AuthenticatorNavBarTab : Parcelable {
*/
@Parcelize
data object VerificationCodes : AuthenticatorNavBarTab() {
override val iconResSelected get() = R.drawable.ic_verification_codes_filled
override val iconRes get() = R.drawable.ic_verification_codes
override val iconResSelected get() = BitwardenDrawable.ic_verification_codes_filled
override val iconRes get() = BitwardenDrawable.ic_verification_codes
override val labelRes get() = R.string.verification_codes
override val contentDescriptionRes get() = R.string.verification_codes
override val route get() = ItemListingRoute.toObjectNavigationRoute()
@ -319,8 +320,8 @@ private sealed class AuthenticatorNavBarTab : Parcelable {
*/
@Parcelize
data object Settings : AuthenticatorNavBarTab() {
override val iconResSelected get() = R.drawable.ic_settings_filled
override val iconRes get() = R.drawable.ic_settings
override val iconResSelected get() = BitwardenDrawable.ic_settings_solid
override val iconRes get() = BitwardenDrawable.ic_settings
override val labelRes get() = R.string.settings
override val contentDescriptionRes get() = R.string.settings
override val route get() = SettingsGraphRoute.toObjectNavigationRoute()

View File

@ -19,7 +19,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.bitwarden.authenticator.R
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* The empty state for the item search screen.
@ -35,7 +35,7 @@ fun ItemSearchEmptyContent(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
painter = painterResource(id = R.drawable.ic_search_24px),
painter = painterResource(id = BitwardenDrawable.ic_search_wide),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier

View File

@ -26,6 +26,7 @@ import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaf
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.bottomDivider
import com.bitwarden.ui.platform.components.appbar.NavigationIcon
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* The search screen for authenticator items.
@ -67,7 +68,7 @@ fun ItemSearchScreen(
onSearchTermChange = searchHandlers.onSearchTermChange,
scrollBehavior = scrollBehavior,
navigationIcon = NavigationIcon(
navigationIcon = painterResource(id = R.drawable.ic_back),
navigationIcon = painterResource(id = BitwardenDrawable.ic_back),
navigationIconContentDescription = stringResource(id = R.string.back),
onNavigationIconClick = searchHandlers.onBackClick,
),

View File

@ -27,6 +27,7 @@ import com.bitwarden.authenticator.ui.platform.components.indicator.BitwardenCir
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.components.icon.BitwardenIcon
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* The verification code item displayed to the user.
@ -115,7 +116,7 @@ fun VaultVerificationCodeItem(
onClick = onCopyClick,
) {
Icon(
painter = painterResource(id = R.drawable.ic_copy),
painter = painterResource(id = BitwardenDrawable.ic_copy),
contentDescription = stringResource(id = R.string.copy),
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(24.dp),
@ -130,7 +131,7 @@ fun VaultVerificationCodeItem(
private fun VerificationCodeItem_preview() {
AuthenticatorTheme {
VaultVerificationCodeItem(
startIcon = IconData.Local(R.drawable.ic_login_item),
startIcon = IconData.Local(BitwardenDrawable.ic_login_item),
issuer = "Sample Label",
supportingLabel = "Supporting Label",
authCode = "1234567890".chunked(3).joinToString(" "),

View File

@ -6,8 +6,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.tooling.preview.Preview
import com.bitwarden.authenticator.R
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Represents the Authenticator search action item.
@ -29,7 +29,7 @@ fun AuthenticatorSearchActionItem(
modifier = Modifier.testTag("SearchButton"),
) {
Icon(
painter = rememberVectorPainter(id = R.drawable.ic_search_24px),
painter = rememberVectorPainter(id = BitwardenDrawable.ic_search_wide),
contentDescription = contentDescription,
)
}

View File

@ -110,7 +110,7 @@ private fun ActionCardPreview() {
@Composable
private fun ActionCardWithTrailingPreview() {
BitwardenActionCard(
actionIcon = rememberVectorPainter(id = R.drawable.ic_bitwarden),
actionIcon = rememberVectorPainter(id = BitwardenDrawable.ic_shield),
actionText = "An action with trailing content",
titleText = "This is a title",
callToActionText = "Take action",

View File

@ -31,11 +31,11 @@ import androidx.compose.ui.semantics.role
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenSelectionDialog
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenSelectionRow
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.components.model.TooltipData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.util.asText
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@ -118,7 +118,7 @@ fun BitwardenMultiSelectButton(
modifier = Modifier.size(16.dp),
) {
Icon(
painter = painterResource(id = R.drawable.ic_tooltip_small),
painter = painterResource(id = BitwardenDrawable.ic_tooltip_small),
contentDescription = it.contentDescription,
)
}
@ -130,7 +130,7 @@ fun BitwardenMultiSelectButton(
enabled = shouldShowDialog,
trailingIcon = {
Icon(
painter = painterResource(id = R.drawable.ic_region_select_dropdown),
painter = painterResource(id = BitwardenDrawable.ic_region_select_dropdown),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)

View File

@ -30,6 +30,7 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.components.util.nonLetterColorVisualTransformation
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Represents a Bitwarden-styled password field that hoists show/hide password state to the caller.
@ -103,9 +104,9 @@ fun BitwardenPasswordField(
) {
@DrawableRes
val painterRes = if (showPassword) {
R.drawable.ic_visibility_off
BitwardenDrawable.ic_visibility_off
} else {
R.drawable.ic_visibility
BitwardenDrawable.ic_visibility
}
@StringRes

View File

@ -14,9 +14,9 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.components.row.BitwardenRowOfActions
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Represents a Bitwarden-styled text field accompanied by a series of actions.
@ -91,7 +91,7 @@ private fun BitwardenTextFieldWithActions_preview() {
onValueChange = {},
actions = {
Icon(
painter = painterResource(id = R.drawable.ic_tooltip),
painter = painterResource(id = BitwardenDrawable.ic_tooltip),
contentDescription = "Action 1",
)
},

View File

@ -9,9 +9,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.components.model.IconResource
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* An icon button that displays an icon from the provided [IconResource].
@ -52,7 +52,7 @@ private fun BitwardenIconButtonWithResource_preview() {
AuthenticatorTheme {
BitwardenIconButtonWithResource(
iconRes = IconResource(
iconPainter = painterResource(id = R.drawable.ic_tooltip),
iconPainter = painterResource(id = BitwardenDrawable.ic_tooltip),
contentDescription = "Sample Icon",
),
onClick = {},

View File

@ -38,6 +38,7 @@ import com.bitwarden.authenticator.ui.platform.components.model.IconResource
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.components.icon.BitwardenIcon
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@ -135,7 +136,7 @@ fun BitwardenListItem(
modifier = Modifier.semantics { optionsTestTag?.let { testTag = it } },
) {
Icon(
painter = painterResource(id = R.drawable.ic_more_horizontal),
painter = painterResource(id = BitwardenDrawable.ic_more_horizontal),
contentDescription = stringResource(id = R.string.options),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.size(24.dp),
@ -180,7 +181,7 @@ private fun BitwardenListItem_preview() {
BitwardenListItem(
label = "Sample Label",
supportingLabel = "Jan 3, 2024, 10:35 AM",
startIcon = IconData.Local(R.drawable.ic_login_item),
startIcon = IconData.Local(BitwardenDrawable.ic_login_item),
onClick = {},
selectionDataList = persistentListOf(),
)

View File

@ -15,6 +15,7 @@ import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenTwoBut
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.base.util.mirrorIfRtl
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Represents a row of text that can be clicked on and contains an external link.
@ -52,7 +53,7 @@ fun BitwardenExternalLinkRow(
) {
Icon(
modifier = Modifier.mirrorIfRtl(),
painter = rememberVectorPainter(id = R.drawable.ic_external_link),
painter = rememberVectorPainter(id = BitwardenDrawable.ic_external_link),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)

View File

@ -5,13 +5,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.text.input.KeyboardType
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.components.field.BitwardenTextFieldWithActions
import com.bitwarden.authenticator.ui.platform.components.icon.BitwardenIconButtonWithResource
import com.bitwarden.authenticator.ui.platform.components.model.IconResource
import com.bitwarden.ui.platform.base.util.ZERO_WIDTH_CHARACTER
import com.bitwarden.ui.platform.base.util.orNullIfBlank
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Displays a stepper that allows the user to increment and decrement an int value.
@ -58,7 +58,7 @@ fun BitwardenStepper(
actions = {
BitwardenIconButtonWithResource(
iconRes = IconResource(
iconPainter = rememberVectorPainter(id = R.drawable.ic_minus),
iconPainter = rememberVectorPainter(id = BitwardenDrawable.ic_minus),
contentDescription = "\u2212",
),
onClick = {
@ -76,7 +76,7 @@ fun BitwardenStepper(
)
BitwardenIconButtonWithResource(
iconRes = IconResource(
iconPainter = rememberVectorPainter(id = R.drawable.ic_plus),
iconPainter = rememberVectorPainter(id = BitwardenDrawable.ic_plus),
contentDescription = "+",
),
onClick = {

View File

@ -34,6 +34,7 @@ import com.bitwarden.ui.platform.base.util.standardHorizontalMargin
import com.bitwarden.ui.platform.components.appbar.NavigationIcon
import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.resource.BitwardenDrawable
/**
* Top level screen for the debug menu.
@ -62,7 +63,7 @@ fun DebugMenuScreen(
title = stringResource(R.string.debug_menu),
scrollBehavior = scrollBehavior,
navigationIcon = NavigationIcon(
navigationIcon = rememberVectorPainter(R.drawable.ic_back),
navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_back),
navigationIconContentDescription = stringResource(id = R.string.back),
onNavigationIconClick = remember(viewModel) {
{

View File

@ -69,6 +69,7 @@ import com.bitwarden.ui.platform.base.util.mirrorIfRtl
import com.bitwarden.ui.platform.base.util.spanStyleOf
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
@ -310,7 +311,7 @@ private fun VaultSettings(
modifier = Modifier
.mirrorIfRtl()
.size(24.dp),
painter = painterResource(id = R.drawable.ic_navigate_next),
painter = painterResource(id = BitwardenDrawable.ic_navigate_next),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)
@ -328,7 +329,7 @@ private fun VaultSettings(
modifier = Modifier
.mirrorIfRtl()
.size(24.dp),
painter = painterResource(id = R.drawable.ic_navigate_next),
painter = painterResource(id = BitwardenDrawable.ic_navigate_next),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)
@ -370,10 +371,8 @@ private fun VaultSettings(
withDivider = true,
content = {
Icon(
modifier = Modifier
.mirrorIfRtl()
.size(24.dp),
painter = painterResource(id = R.drawable.ic_external_link),
modifier = Modifier.mirrorIfRtl(),
painter = painterResource(id = BitwardenDrawable.ic_external_link),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)
@ -510,7 +509,7 @@ private fun ThemeSelectionRow(
.mirrorIfRtl()
.size(24.dp),
painter = painterResource(
id = R.drawable.ic_navigate_next,
id = BitwardenDrawable.ic_navigate_next,
),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
@ -647,7 +646,7 @@ private fun CopyRow(
color = MaterialTheme.colorScheme.onSurface,
)
Icon(
painter = rememberVectorPainter(id = R.drawable.ic_copy),
painter = rememberVectorPainter(id = BitwardenDrawable.ic_copy),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)

View File

@ -3,6 +3,7 @@ package com.bitwarden.authenticator.ui.platform.feature.tutorial
import android.os.Parcelable
import com.bitwarden.authenticator.R
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.update
import kotlinx.parcelize.Parcelize
@ -91,7 +92,7 @@ data class TutorialState(
*/
@Parcelize
data object IntroSlide : TutorialSlide() {
override val image: Int get() = R.drawable.ic_tutorial_verification_codes
override val image: Int get() = BitwardenDrawable.ic_tutorial_verification_codes
override val title: Int get() = R.string.secure_your_accounts_with_bitwarden_authenticator
override val message: Int get() = R.string.get_verification_codes_for_all_your_accounts
}
@ -101,7 +102,7 @@ data class TutorialState(
*/
@Parcelize
data object QrScannerSlide : TutorialSlide() {
override val image: Int get() = R.drawable.ic_tutorial_qr_scanner
override val image: Int get() = BitwardenDrawable.ic_tutorial_qr_scanner
override val title: Int get() = R.string.use_your_device_camera_to_scan_codes
override val message: Int get() = R.string.scan_the_qr_code_in_your_2_step_verification_settings_for_any_account
}
@ -111,7 +112,7 @@ data class TutorialState(
*/
@Parcelize
data object UniqueCodesSlide : TutorialSlide() {
override val image: Int get() = R.drawable.ic_tutorial_2fa
override val image: Int get() = BitwardenDrawable.ic_tutorial_2fa
override val title: Int get() = R.string.sign_in_using_unique_codes
override val message: Int get() = R.string.when_using_2_step_verification_youll_enter_your_username_and_password_and_a_code_generated_in_this_app
}

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="25dp"
android:viewportHeight="25"
android:viewportWidth="24">
<path
android:fillColor="#ffffff"
android:pathData="M20,11.103H7.83L13.42,5.513L12,4.103L4,12.103L12,20.103L13.41,18.693L7.83,13.103H20V11.103Z" />
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="20dp"
android:viewportWidth="18"
android:viewportHeight="20">
<path
android:pathData="M17.186,0.25C17.109,0.171 17.017,0.108 16.916,0.064C16.814,0.021 16.704,-0.001 16.593,0L1.408,0C1.297,-0.001 1.187,0.021 1.085,0.064C0.983,0.108 0.892,0.171 0.816,0.25C0.735,0.325 0.671,0.416 0.628,0.517C0.584,0.618 0.562,0.726 0.563,0.835L0.563,10.835C0.566,11.596 0.715,12.35 1.003,13.056C1.277,13.753 1.645,14.41 2.098,15.01C2.563,15.611 3.083,16.166 3.653,16.671C4.181,17.15 4.738,17.598 5.319,18.012C5.826,18.367 6.357,18.704 6.914,19.021C7.471,19.339 7.864,19.553 8.093,19.665C8.325,19.777 8.512,19.866 8.651,19.925C8.76,19.977 8.88,20.002 9.001,20C9.12,20.002 9.237,19.974 9.344,19.921C9.485,19.86 9.67,19.774 9.904,19.661C10.138,19.549 10.537,19.334 11.084,19.017C11.63,18.701 12.168,18.364 12.678,18.009C13.26,17.594 13.818,17.146 14.347,16.667C14.917,16.163 15.438,15.607 15.903,15.006C16.354,14.406 16.722,13.749 16.997,13.052C17.286,12.346 17.435,11.592 17.438,10.831V0.831C17.438,0.723 17.416,0.615 17.372,0.515C17.329,0.415 17.265,0.325 17.186,0.25ZM15.228,10.926C15.228,14.551 9.001,17.665 9.001,17.665L9.001,2.142L15.228,2.142L15.228,10.926Z"
android:fillColor="#175DDC"/>
</vector>

View File

@ -1,13 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="18dp"
android:viewportWidth="20"
android:viewportHeight="18">
<path
android:pathData="M3.125,5.25C2.78,5.25 2.5,5.53 2.5,5.875C2.5,6.22 2.78,6.5 3.125,6.5H4.375C4.72,6.5 5,6.22 5,5.875C5,5.53 4.72,5.25 4.375,5.25H3.125Z"
android:fillColor="#000000"/>
<path
android:pathData="M14.219,0.25H7.969C6.588,0.25 5.469,1.369 5.469,2.75H2.5C1.119,2.75 0,3.869 0,5.25V14C0,15.381 1.119,16.5 2.5,16.5H7.396C8.479,17.286 9.81,17.75 11.25,17.75C12.69,17.75 14.021,17.286 15.104,16.5H17.5C18.881,16.5 20,15.381 20,14V5.25C20,3.869 18.881,2.75 17.5,2.75H16.719C16.719,1.369 15.599,0.25 14.219,0.25ZM4.688,11.188C4.688,12.722 5.214,14.133 6.096,15.25H2.5C1.81,15.25 1.25,14.69 1.25,14V5.25C1.25,4.56 1.81,4 2.5,4H5.469C6.159,4 6.719,3.44 6.719,2.75C6.719,2.06 7.278,1.5 7.969,1.5H14.219C14.909,1.5 15.469,2.06 15.469,2.75C15.469,3.44 16.028,4 16.719,4H17.5C18.19,4 18.75,4.56 18.75,5.25V14C18.75,14.69 18.19,15.25 17.5,15.25H16.404C16.376,15.286 16.347,15.322 16.318,15.357C17.252,14.224 17.813,12.771 17.813,11.188C17.813,7.563 14.874,4.625 11.25,4.625C7.626,4.625 4.688,7.563 4.688,11.188ZM11.25,16.5C14.184,16.5 16.563,14.122 16.563,11.188C16.563,8.253 14.184,5.875 11.25,5.875C8.316,5.875 5.938,8.253 5.938,11.188C5.938,14.122 8.316,16.5 11.25,16.5Z"
android:fillColor="#000000"
android:fillType="evenOdd"/>
</vector>

View File

@ -1,13 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="18"
android:viewportHeight="18">
<group>
<clip-path
android:pathData="M1.5,1.5h15v15h-15z"/>
<path
android:pathData="M8.677,11.585C8.961,11.874 9.084,11.823 9.361,11.538C9.361,11.538 15.286,5.843 15.704,5.455C16.122,5.068 16.892,5.635 16.262,6.214C15.633,6.794 9.835,12.381 9.835,12.381C9.335,12.788 8.655,12.788 8.155,12.381L1.808,6.295C1.105,5.656 1.74,4.944 2.356,5.533C4.726,7.797 8.677,11.585 8.677,11.585Z"
android:fillColor="#175DDC"/>
</group>
</vector>

View File

@ -1,13 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="18"
android:viewportHeight="18">
<group>
<clip-path
android:pathData="M1.5,1.5h15v15h-15z"/>
<path
android:pathData="M9.323,6.415C9.039,6.126 8.916,6.177 8.639,6.462C8.639,6.462 2.714,12.157 2.296,12.545C1.878,12.932 1.108,12.365 1.738,11.785C2.367,11.206 8.165,5.619 8.165,5.619C8.665,5.212 9.345,5.212 9.845,5.619L16.192,11.705C16.895,12.344 16.26,13.056 15.644,12.467C13.274,10.203 9.323,6.415 9.323,6.415Z"
android:fillColor="#175DDC"/>
</group>
</vector>

View File

@ -1,17 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<clip-path
android:pathData="M2,2h20v20h-20z"/>
<path
android:pathData="M7.625,5.75H20.125C21.16,5.75 22,6.589 22,7.625V20.125C22,21.16 21.16,22 20.125,22H7.625C6.589,22 5.75,21.16 5.75,20.125V7.625C5.75,6.589 6.589,5.75 7.625,5.75ZM7.625,7C7.28,7 7,7.28 7,7.625V20.125C7,20.47 7.28,20.75 7.625,20.75H20.125C20.47,20.75 20.75,20.47 20.75,20.125V7.625C20.75,7.28 20.47,7 20.125,7H7.625Z"
android:fillColor="#000000"
android:fillType="evenOdd"/>
<path
android:pathData="M16.375,2H3.875C2.839,2 2,2.839 2,3.875V16.375C2,17.41 2.839,18.25 3.875,18.25H5.75V17H3.875C3.53,17 3.25,16.72 3.25,16.375V3.875C3.25,3.53 3.53,3.25 3.875,3.25H16.375C16.72,3.25 17,3.53 17,3.875V5.75H18.25V3.875C18.25,2.839 17.41,2 16.375,2Z"
android:fillColor="#000000"/>
</group>
</vector>

View File

@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#1B1B1F"
android:pathData="M17.366,2.08L20.811,2.206L20.812,2.206C21.106,2.218 21.384,2.346 21.586,2.562C21.788,2.777 21.897,3.063 21.889,3.357L21.798,6.76C21.784,6.924 21.708,7.078 21.585,7.187C21.461,7.296 21.3,7.354 21.134,7.347C20.968,7.341 20.811,7.271 20.694,7.152C20.577,7.034 20.51,6.875 20.507,6.71L20.563,4.589C20.559,4.57 20.55,4.552 20.537,4.537C20.524,4.523 20.508,4.511 20.49,4.504C20.471,4.497 20.452,4.495 20.433,4.497C20.413,4.5 20.395,4.507 20.379,4.518L13.545,11.325C13.422,11.437 13.261,11.497 13.094,11.493C12.927,11.489 12.768,11.42 12.649,11.302C12.531,11.184 12.462,11.025 12.457,10.857C12.452,10.69 12.512,10.529 12.624,10.406L19.411,3.653C19.511,3.454 19.257,3.44 19.257,3.44L17.329,3.37C17.164,3.355 17.01,3.277 16.899,3.153C16.789,3.028 16.73,2.867 16.734,2.701C16.739,2.535 16.808,2.378 16.925,2.263C17.042,2.147 17.201,2.082 17.366,2.08Z" />
<path
android:fillColor="#1B1B1F"
android:pathData="M12,3.25H5.125C4.089,3.25 3.25,4.089 3.25,5.125V18.875C3.25,19.91 4.089,20.75 5.125,20.75H18.875C19.91,20.75 20.75,19.91 20.75,18.875V12C20.75,11.655 20.47,11.375 20.125,11.375C19.78,11.375 19.5,11.655 19.5,12V18.875C19.5,19.22 19.22,19.5 18.875,19.5H5.125C4.78,19.5 4.5,19.22 4.5,18.875V5.125C4.5,4.78 4.78,4.5 5.125,4.5H12C12.345,4.5 12.625,4.22 12.625,3.875C12.625,3.53 12.345,3.25 12,3.25Z" />
</vector>

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="M20,5H4C2.9,5 2.01,5.9 2.01,7L2,17C2,18.1 2.9,19 4,19H20C21.1,19 22,18.1 22,17V7C22,5.9 21.1,5 20,5ZM20,7V17H4V7H20ZM13,8H11V10H13V8ZM11,11H13V13H11V11ZM10,8H8V10H10V8ZM8,11H10V13H8V11ZM7,11H5V13H7V11ZM5,8H7V10H5V8ZM16,14H8V16H16V14ZM14,11H16V13H14V11ZM16,8H14V10H16V8ZM17,11H19V13H17V11ZM19,8H17V10H19V8Z" />
</vector>

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M4.375,10C4.375,9.655 4.655,9.375 5,9.375H15C15.345,9.375 15.625,9.655 15.625,10C15.625,10.345 15.345,10.625 15,10.625H5C4.655,10.625 4.375,10.345 4.375,10Z"
android:fillColor="#151B2C"
android:fillType="evenOdd"/>
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportHeight="20"
android:viewportWidth="20">
<path
android:fillColor="#151B2C"
android:pathData="M10,1.875C10,1.53 9.72,1.25 9.375,1.25C9.03,1.25 8.75,1.53 8.75,1.875V10H0.625C0.28,10 0,10.28 0,10.625C0,10.97 0.28,11.25 0.625,11.25H8.75V19.375C8.75,19.72 9.03,20 9.375,20C9.72,20 10,19.72 10,19.375V11.25H18.125C18.47,11.25 18.75,10.97 18.75,10.625C18.75,10.28 18.47,10 18.125,10H10V1.875Z" />
</vector>

View File

@ -1,18 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="20"
android:viewportHeight="20">
<group>
<clip-path
android:pathData="M0,0h20v20h-20z"/>
<path
android:pathData="M0,11.738V8.238C0,7.478 0.616,6.863 1.375,6.863H2.178C2.47,6.131 2.862,5.451 3.336,4.838L2.928,4.145C2.542,3.491 2.76,2.648 3.414,2.262L6.429,0.485C7.083,0.099 7.926,0.317 8.312,0.971L8.72,1.663C9.138,1.599 9.565,1.566 10,1.566C10.408,1.566 10.811,1.596 11.204,1.652L11.606,0.956C11.986,0.298 12.827,0.073 13.484,0.453L16.515,2.203C17.173,2.582 17.399,3.423 17.019,4.081L16.617,4.778C17.112,5.406 17.52,6.107 17.822,6.863H18.625C19.384,6.863 20,7.478 20,8.238V11.738C20,12.497 19.384,13.113 18.625,13.113H17.822C17.53,13.844 17.138,14.525 16.664,15.138L17.072,15.831C17.458,16.485 17.24,17.328 16.586,17.713L13.571,19.491C12.917,19.877 12.074,19.659 11.688,19.005L11.28,18.312C10.862,18.376 10.435,18.409 10,18.409C9.592,18.409 9.19,18.38 8.796,18.324L8.394,19.02C8.014,19.677 7.173,19.903 6.516,19.523L3.484,17.773C2.827,17.393 2.601,16.552 2.981,15.895L3.383,15.198C2.888,14.57 2.48,13.869 2.178,13.113H1.375C0.616,13.113 0,12.497 0,11.738ZM1.25,8.238C1.25,8.169 1.306,8.113 1.375,8.113H2.98C3.037,8.113 3.086,8.075 3.102,8.021C3.423,6.891 4.015,5.874 4.803,5.046C4.842,5.005 4.849,4.943 4.821,4.895L4.004,3.51C3.969,3.451 3.989,3.374 4.049,3.339L7.064,1.562C7.123,1.526 7.2,1.546 7.235,1.606L8.05,2.989C8.079,3.037 8.136,3.061 8.191,3.046C8.769,2.896 9.375,2.816 10,2.816C10.602,2.816 11.187,2.891 11.746,3.03C11.8,3.044 11.858,3.02 11.886,2.971L12.689,1.581C12.723,1.521 12.8,1.501 12.859,1.535L15.891,3.285C15.95,3.32 15.971,3.396 15.936,3.456L15.133,4.848C15.104,4.897 15.113,4.958 15.152,4.999C15.962,5.836 16.57,6.869 16.898,8.021C16.914,8.075 16.963,8.113 17.02,8.113H18.625C18.694,8.113 18.75,8.169 18.75,8.238V11.738C18.75,11.807 18.694,11.863 18.625,11.863H17.02C16.963,11.863 16.914,11.901 16.898,11.955C16.577,13.085 15.985,14.101 15.197,14.93C15.158,14.97 15.151,15.032 15.179,15.081L15.995,16.465C16.031,16.525 16.011,16.602 15.951,16.637L12.936,18.414C12.877,18.449 12.8,18.429 12.765,18.37L11.95,16.987C11.921,16.938 11.863,16.915 11.809,16.929C11.231,17.079 10.625,17.159 10,17.159C9.398,17.159 8.813,17.085 8.254,16.945C8.2,16.932 8.142,16.955 8.114,17.004L7.311,18.395C7.277,18.455 7.2,18.475 7.141,18.441L4.109,16.691C4.05,16.656 4.029,16.58 4.064,16.52L4.867,15.128C4.896,15.079 4.887,15.017 4.848,14.977C4.038,14.14 3.43,13.107 3.102,11.955C3.086,11.901 3.037,11.863 2.98,11.863H1.375C1.306,11.863 1.25,11.807 1.25,11.738V8.238Z"
android:fillColor="#1B1B1F"
android:fillType="evenOdd"/>
<path
android:pathData="M10,6.875C8.274,6.875 6.875,8.274 6.875,10C6.875,11.726 8.274,13.125 10,13.125C11.726,13.125 13.125,11.726 13.125,10C13.125,8.274 11.726,6.875 10,6.875ZM5.625,10C5.625,7.584 7.584,5.625 10,5.625C12.416,5.625 14.375,7.584 14.375,10C14.375,12.417 12.416,14.375 10,14.375C7.584,14.375 5.625,12.417 5.625,10Z"
android:fillColor="#1B1B1F"
android:fillType="evenOdd"/>
</group>
</vector>

View File

@ -141,4 +141,5 @@
<string name="file_could_not_be_processed">"File Could Not Be Processed"</string>
<string name="file_could_not_be_processed_message">"File could not be processed. Ensure its valid JSON and try again. Need help? Visit bitwarden.com/help"</string>
<string name="get_help">Get Help</string>
<string name="expand_advanced_options">Expand advanced options</string>
</resources>

View File

@ -1,7 +1,6 @@
package com.bitwarden.authenticator.ui.authenticator.feature.search
import androidx.lifecycle.SavedStateHandle
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.data.authenticator.manager.model.VerificationCodeItem
import com.bitwarden.authenticator.data.authenticator.manager.util.createMockVerificationCodeItem
import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository
@ -13,6 +12,7 @@ import com.bitwarden.authenticator.ui.authenticator.feature.model.VerificationCo
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.components.icon.model.IconData
import com.bitwarden.ui.platform.resource.BitwardenDrawable
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
@ -142,7 +142,7 @@ private val SHARED_AND_LOCAL_DISPLAY_ITEMS = listOf(
timeLeftSeconds = SHARED_ITEMS[0].timeLeftSeconds,
alertThresholdSeconds = 7,
startIcon = IconData.Local(
iconRes = R.drawable.ic_login_item,
iconRes = BitwardenDrawable.ic_login_item,
testTag = "BitwardenIcon",
),
subtitle = SHARED_ITEMS[0].label,
@ -158,7 +158,7 @@ private val SHARED_AND_LOCAL_DISPLAY_ITEMS = listOf(
timeLeftSeconds = LOCAL_ITEMS[0].timeLeftSeconds,
alertThresholdSeconds = 7,
startIcon = IconData.Local(
iconRes = R.drawable.ic_login_item,
iconRes = BitwardenDrawable.ic_login_item,
testTag = "BitwardenIcon",
),
subtitle = LOCAL_ITEMS[0].label,