Update Compose BOM to 2025.04.01 (#5134)

This commit is contained in:
David Perez
2025-05-07 19:16:32 +00:00
committed by GitHub
parent 625ac0ea5f
commit 76fb85ac1f
19 changed files with 56 additions and 59 deletions
@@ -5,7 +5,7 @@ package com.x8bit.bitwarden.ui.platform.base.util
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.VisualTransformation
@@ -103,7 +103,7 @@ fun String?.orNullIfBlank(): String? = this?.takeUnless { it.isBlank() }
*/
@Composable
fun String.lowercaseWithCurrentLocal(): String {
return lowercase(LocalContext.current.resources.configuration.locales[0])
return lowercase(LocalConfiguration.current.locales[0])
}
/**
@@ -13,7 +13,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.testTag
@@ -41,7 +40,6 @@ import kotlinx.collections.immutable.persistentListOf
* @param menuItemDataList The list of [OverflowMenuItemData] that will populate the overflow
* dropdown menu.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenOverflowActionItem(
menuItemDataList: ImmutableList<OverflowMenuItemData>,
@@ -3,7 +3,6 @@ package com.x8bit.bitwarden.ui.platform.components.dialog
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -31,7 +30,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* @param onDismissRequest A lambda that is invoked when the user has requested to dismiss the
* dialog, whether by tapping "OK", tapping outside the dialog, or pressing the back button.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Suppress("LongMethod")
@Composable
fun BitwardenBasicDialog(
@@ -11,7 +11,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -36,7 +35,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* tapping outside of it).
*/
@Suppress("LongMethod")
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenClientCertificateDialog(
onConfirmClick: (alias: String, password: String) -> Unit,
@@ -18,7 +18,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -60,7 +59,7 @@ import java.time.ZonedDateTime
* @param modifier A [Modifier] that you can use to apply custom modifications to the composable.
*/
@Suppress("LongMethod")
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BitwardenDateSelectButton(
label: String,
@@ -3,7 +3,6 @@ package com.x8bit.bitwarden.ui.platform.components.dialog
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
@@ -28,7 +27,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
*
* @param text The text to display in the dialog.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenLoadingDialog(
text: String,
@@ -11,7 +11,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -32,7 +31,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* @param onDismissRequest called when the user attempts to dismiss the dialog (for example by
* tapping outside of it).
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenMasterPasswordDialog(
onConfirmClick: (masterPassword: String) -> Unit,
@@ -8,7 +8,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -28,7 +27,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* @param onDismissRequest called when the user attempts to dismiss the dialog (for example by
* tapping outside of it).
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenPinDialog(
onConfirmClick: (pin: String) -> Unit,
@@ -10,8 +10,12 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.testTag
@@ -37,7 +41,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* [BitwardenSelectionRow].
*/
@Suppress("LongMethod")
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenSelectionDialog(
title: String,
@@ -49,6 +52,12 @@ fun BitwardenSelectionDialog(
) {
val configuration = LocalConfiguration.current
val scrollState = rememberScrollState()
var canScrollForward by remember { mutableStateOf(value = false) }
var canScrollBackward by remember { mutableStateOf(value = false) }
LaunchedEffect(scrollState.canScrollForward, scrollState.canScrollForward) {
canScrollForward = scrollState.canScrollForward
canScrollBackward = scrollState.canScrollBackward
}
Column(
modifier = Modifier
.semantics {
@@ -74,7 +83,7 @@ fun BitwardenSelectionDialog(
color = BitwardenTheme.colorScheme.text.primary,
style = BitwardenTheme.typography.headlineSmall,
)
if (scrollState.canScrollBackward) {
if (canScrollBackward) {
BitwardenHorizontalDivider()
}
Column(
@@ -83,7 +92,7 @@ fun BitwardenSelectionDialog(
.verticalScroll(scrollState),
content = selectionItems,
)
if (scrollState.canScrollForward) {
if (canScrollForward) {
BitwardenHorizontalDivider()
}
BitwardenTextButton(
@@ -9,7 +9,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
@@ -35,7 +34,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* @param autoFocus When set to true, the view will request focus after the first recomposition.
* @param initialText The text that will be visible at the start of text entry.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenTextEntryDialog(
title: String?,
@@ -22,7 +22,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -129,7 +128,6 @@ private fun bitwardenTimePickerColors(): TimePickerColors = TimePickerColors(
timeSelectorUnselectedContentColor = BitwardenTheme.colorScheme.text.primary,
)
@OptIn(ExperimentalComposeUiApi::class)
@Composable
private fun TimePickerDialog(
onDismissRequest: () -> Unit,
@@ -3,7 +3,6 @@ package com.x8bit.bitwarden.ui.platform.components.dialog
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
@@ -16,7 +15,6 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
@@ -47,7 +45,6 @@ import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme
* @param confirmTextColor The color of the confirm text.
* @param dismissTextColor The color of the dismiss text.
*/
@OptIn(ExperimentalLayoutApi::class, ExperimentalComposeUiApi::class)
@Composable
@Suppress("LongMethod")
fun BitwardenTwoButtonDialog(
@@ -31,7 +31,6 @@ import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onGloballyPositioned
@@ -60,7 +59,7 @@ import com.x8bit.bitwarden.ui.platform.util.rememberWindowSize
* The [overlay] is a nonstandard [Composable] that is placed over top the `utilityBar` and
* `content`.
*/
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("LongMethod")
@Composable
fun BitwardenScaffold(
@@ -18,7 +18,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.testTag
@@ -50,7 +49,6 @@ private const val MINIMUM_PIN_LENGTH: Int = 4
* want to restrict PINs to numeric values but also support any existing PINs with non-numeric
* characters.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Suppress("LongMethod")
@Composable
fun PinInputDialog(
@@ -28,10 +28,10 @@ import androidx.compose.ui.test.performSemanticsAction
import androidx.compose.ui.test.performTextInput
import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.components.model.IconData
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@@ -2546,14 +2546,14 @@ class VaultItemScreenTest : BaseComposeTest() {
@Test
fun `in identity state, on copy identity name field click should send CopyIdentityNameClick`() {
val identityName = "the identity name"
mutableStateFlow.update { it.copy(viewState = DEFAULT_IDENTITY_VIEW_STATE) }
composeTestRule.onNodeWithTextAfterScroll(identityName)
// We scroll to username, which is right after the identity to avoid clicking on the FAB
composeTestRule.onNodeWithTextAfterScroll("Username")
composeTestRule
.onNodeWithTag("IdentityCopyNameButton")
.performSemanticsAction(SemanticsActions.OnClick)
.onNodeWithContentDescriptionAfterScroll("Copy identity name")
.assertIsDisplayed()
.performClick()
verify {
viewModel.trySendAction(VaultItemAction.ItemType.Identity.CopyIdentityNameClick)
@@ -2567,7 +2567,8 @@ class VaultItemScreenTest : BaseComposeTest() {
composeTestRule.onNodeWithTextAfterScroll("Company")
composeTestRule
.onNodeWithTag("IdentityCopyUsernameButton")
.onNodeWithContentDescriptionAfterScroll("Copy username")
.assertIsDisplayed()
.performClick()
verify {
@@ -2580,10 +2581,10 @@ class VaultItemScreenTest : BaseComposeTest() {
mutableStateFlow.update { it.copy(viewState = DEFAULT_IDENTITY_VIEW_STATE) }
// Scroll to ssn so we can see the Copy company button but not have it covered by the FAB
composeTestRule.onNodeWithTextAfterScroll("the SSN")
composeTestRule.onNodeWithTextAfterScroll("Social Security number")
composeTestRule
.onNodeWithTag("IdentityCopyCompanyButton")
.onNodeWithContentDescriptionAfterScroll("Copy company")
.assertIsDisplayed()
.performClick()
verify {
@@ -2593,12 +2594,15 @@ class VaultItemScreenTest : BaseComposeTest() {
@Test
fun `in identity state, on copy SSN field click should send CopySsnClick`() {
val ssn = "the SSN"
mutableStateFlow.update { it.copy(viewState = DEFAULT_IDENTITY_VIEW_STATE) }
composeTestRule.onNodeWithTextAfterScroll(ssn)
// Scroll to passport so we can see the Copy ssn button but not have it covered by the FAB
composeTestRule.onNodeWithTextAfterScroll("Passport number")
composeTestRule
.onNodeWithTag("IdentityCopySsnButton")
.onNodeWithTextAfterScroll("Social Security number")
.onChildren()
.filterToOne(hasContentDescription("Copy social security number"))
.assertIsDisplayed()
.performClick()
verify {
@@ -2639,8 +2643,9 @@ class VaultItemScreenTest : BaseComposeTest() {
@Test
fun `in identity state, on copy email field click should send CopyEmailClick`() {
mutableStateFlow.update { it.copy(viewState = DEFAULT_IDENTITY_VIEW_STATE) }
composeTestRule.onFirstNodeWithTextAfterScroll("the address")
// Scroll to passport so we can see the Copy email button but not have it covered by the FAB
composeTestRule.onNodeWithTextAfterScroll("Phone")
composeTestRule
.onNodeWithContentDescriptionAfterScroll("Copy email")
.performClick()
@@ -2718,10 +2723,14 @@ class VaultItemScreenTest : BaseComposeTest() {
.assertTextEquals("Number", "••••••")
.assertIsEnabled()
composeTestRule
.onNodeWithContentDescription("Copy number")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Copy number"))
.assertIsDisplayed()
composeTestRule
.onNodeWithContentDescription("Show")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Show"))
.assertIsDisplayed()
.performClick()
@@ -2754,10 +2763,14 @@ class VaultItemScreenTest : BaseComposeTest() {
.assertTextEquals("Number", "••••••")
.assertIsEnabled()
composeTestRule
.onNodeWithContentDescription("Copy number")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Copy number"))
.assertIsDisplayed()
composeTestRule
.onNodeWithContentDescription("Show")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Show"))
.assertIsDisplayed()
mutableStateFlow.update {
@@ -2778,10 +2791,14 @@ class VaultItemScreenTest : BaseComposeTest() {
.assertTextEquals("Number", "number")
.assertIsEnabled()
composeTestRule
.onNodeWithContentDescription("Copy number")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Copy number"))
.assertIsDisplayed()
composeTestRule
.onNodeWithContentDescription("Hide")
.onNodeWithTextAfterScroll("Number")
.onChildren()
.filterToOne(hasContentDescription("Hide"))
.assertIsDisplayed()
}
@@ -3043,7 +3060,7 @@ class VaultItemScreenTest : BaseComposeTest() {
// We scroll to notes, which is right after the fingerprint to avoid clicking on the FAB
composeTestRule.onNodeWithTextAfterScroll("Notes")
composeTestRule
.onNodeWithContentDescription("Copy fingerprint")
.onNodeWithContentDescriptionAfterScroll("Copy fingerprint")
.performClick()
verify(exactly = 1) {
@@ -3,7 +3,6 @@ package com.bitwarden.authenticator.ui.authenticator.feature.qrcodescan
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
@@ -41,7 +40,6 @@ import com.bitwarden.authenticator.ui.platform.components.util.maxDialogWidth
* parameter is true if the user checked "Save option as default".
*/
@Composable
@OptIn(ExperimentalLayoutApi::class)
@Suppress("LongMethod")
fun ChooseSaveLocationDialog(
onSaveHereClick: (Boolean) -> Unit,
@@ -15,7 +15,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.res.stringResource
@@ -40,7 +39,6 @@ import com.bitwarden.authenticator.ui.platform.components.util.maxDialogHeight
* [BitwardenSelectionRow].
*/
@Suppress("LongMethod")
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenSelectionDialog(
title: String,
@@ -11,7 +11,6 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.semantics.semantics
@@ -21,7 +20,6 @@ import androidx.compose.ui.semantics.testTagsAsResourceId
* Direct passthrough to [Scaffold] but contains a few specific override values. Everything is
* still overridable if necessary.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun BitwardenScaffold(
modifier: Modifier = Modifier,
+1 -1
View File
@@ -13,7 +13,7 @@ androidxActivity = "1.10.1"
androidXBiometrics = "1.2.0-alpha05"
androidxBrowser = "1.8.0"
androidxCamera = "1.4.2"
androidxComposeBom = "2025.04.00"
androidxComposeBom = "2025.04.01"
androidxCore = "1.16.0"
androidxCredentials = "1.5.0"
androidxHiltNavigationCompose = "1.2.0"