Update the Compose BOM (#5957)

This commit is contained in:
David Perez 2025-09-29 14:21:36 -05:00 committed by GitHub
parent 5c5bd25d16
commit 2a134c619d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 33 additions and 74 deletions

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.auth.feature.loginwithdevice package com.x8bit.bitwarden.ui.auth.feature.loginwithdevice
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasAnyAncestor
import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.isDialog
@ -117,14 +116,12 @@ class LoginWithDeviceScreenTest : BitwardenComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = LoginWithDeviceState.ViewState.Loading) it.copy(viewState = LoginWithDeviceState.ViewState.Loading)
} }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = DEFAULT_STATE.viewState) it.copy(viewState = DEFAULT_STATE.viewState)
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.platform.feature.search package com.x8bit.bitwarden.ui.platform.feature.search
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.filterToOne
@ -181,15 +180,13 @@ class SearchScreenTest : BitwardenComposeTest() {
@Test @Test
fun `progressbar should be displayed according to state`() { fun `progressbar should be displayed according to state`() {
mutableStateFlow.update { DEFAULT_STATE } mutableStateFlow.update { DEFAULT_STATE }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = SearchState.ViewState.Empty(message = null)) it.copy(viewState = SearchState.ViewState.Empty(message = null))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,6 +1,5 @@
package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedlogs package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedlogs
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.assertIsNotEnabled
@ -103,8 +102,7 @@ class RecordedLogsScreenTest : BitwardenComposeTest() {
@Test @Test
fun `UI should change based on ViewState`() { fun `UI should change based on ViewState`() {
mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Loading) } mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Loading) }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Empty) } mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Empty) }
composeTestRule.onNodeWithText(text = "No logs recorded").assertIsDisplayed() composeTestRule.onNodeWithText(text = "No logs recorded").assertIsDisplayed()

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.tools.feature.send package com.x8bit.bitwarden.ui.tools.feature.send
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.filterToOne
@ -306,26 +305,22 @@ class SendScreenTest : BitwardenComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = SendState.ViewState.Loading) it.copy(viewState = SendState.ViewState.Loading)
} }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = SendState.ViewState.Empty) it.copy(viewState = SendState.ViewState.Empty)
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = SendState.ViewState.Error("Fail".asText())) it.copy(viewState = SendState.ViewState.Error("Fail".asText()))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = DEFAULT_CONTENT_VIEW_STATE) it.copy(viewState = DEFAULT_CONTENT_VIEW_STATE)
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.tools.feature.send.addedit package com.x8bit.bitwarden.ui.tools.feature.send.addedit
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotDisplayed
@ -731,20 +730,17 @@ class AddEditSendScreenTest : BitwardenComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = AddEditSendState.ViewState.Loading) it.copy(viewState = AddEditSendState.ViewState.Loading)
} }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = AddEditSendState.ViewState.Error("Fail".asText())) it.copy(viewState = AddEditSendState.ViewState.Error("Fail".asText()))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = DEFAULT_VIEW_STATE) it.copy(viewState = DEFAULT_VIEW_STATE)
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.tools.feature.send.viewsend package com.x8bit.bitwarden.ui.tools.feature.send.viewsend
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasAnyAncestor
@ -171,12 +170,10 @@ class ViewSendScreenTest : BitwardenComposeTest() {
@Test @Test
fun `progress bar should be displayed based on ViewState`() { fun `progress bar should be displayed based on ViewState`() {
mutableStateFlow.update { it.copy(viewState = ViewSendState.ViewState.Loading) } mutableStateFlow.update { it.copy(viewState = ViewSendState.ViewState.Loading) }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { it.copy(viewState = DEFAULT_STATE.viewState) } mutableStateFlow.update { it.copy(viewState = DEFAULT_STATE.viewState) }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -618,14 +618,12 @@ class VaultAddEditScreenTest : BitwardenComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = VaultAddEditState.ViewState.Loading) it.copy(viewState = VaultAddEditState.ViewState.Loading)
} }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = VaultAddEditState.ViewState.Error("Fail".asText())) it.copy(viewState = VaultAddEditState.ViewState.Error("Fail".asText()))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
@ -636,8 +634,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() {
), ),
) )
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.vault.feature.attachments package com.x8bit.bitwarden.ui.vault.feature.attachments
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.filterToOne
import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasAnyAncestor
@ -92,20 +91,17 @@ class AttachmentsScreenTest : BitwardenComposeTest() {
@Test @Test
fun `progressbar should be displayed according to state`() { fun `progressbar should be displayed according to state`() {
mutableStateFlow.update { it.copy(viewState = AttachmentsState.ViewState.Loading) } mutableStateFlow.update { it.copy(viewState = AttachmentsState.ViewState.Loading) }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = AttachmentsState.ViewState.Error("Fail".asText())) it.copy(viewState = AttachmentsState.ViewState.Error("Fail".asText()))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = DEFAULT_CONTENT_WITHOUT_ATTACHMENTS) it.copy(viewState = DEFAULT_CONTENT_WITHOUT_ATTACHMENTS)
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -2045,8 +2045,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
) )
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
composeTestRule composeTestRule
.onNodeWithText("Passkey") .onNodeWithText("Passkey")
@ -2091,8 +2090,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
) )
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
composeTestRule composeTestRule
.onNodeWithContentDescription("Copy TOTP") .onNodeWithContentDescription("Copy TOTP")
@ -2113,8 +2111,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
} }
composeTestRule.onNodeWithTextAfterScroll("Authenticator key") composeTestRule.onNodeWithTextAfterScroll("Authenticator key")
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
composeTestRule composeTestRule
.onNodeWithContentDescription("Copy TOTP") .onNodeWithContentDescription("Copy TOTP")
@ -2130,8 +2127,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
} }
composeTestRule.onNodeWithTextAfterScroll("Authenticator key") composeTestRule.onNodeWithTextAfterScroll("Authenticator key")
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
composeTestRule composeTestRule
.onNodeWithContentDescriptionAfterScroll("Copy TOTP") .onNodeWithContentDescriptionAfterScroll("Copy TOTP")
@ -2148,8 +2144,7 @@ class VaultItemScreenTest : BitwardenComposeTest() {
} }
composeTestRule.onNodeWithTextAfterScroll("Authenticator key") composeTestRule.onNodeWithTextAfterScroll("Authenticator key")
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
composeTestRule composeTestRule
.onNodeWithContentDescription("Copy TOTP") .onNodeWithContentDescription("Copy TOTP")
@ -2351,22 +2346,19 @@ class VaultItemScreenTest : BitwardenComposeTest() {
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = VaultItemState.ViewState.Loading) it.copy(viewState = VaultItemState.ViewState.Loading)
} }
// There are 2 because of the pull-to-refresh composeTestRule.onNode(isProgressBar).assertIsDisplayed()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy(viewState = VaultItemState.ViewState.Error("Fail".asText())) it.copy(viewState = VaultItemState.ViewState.Error("Fail".asText()))
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
mutableStateFlow.update { currentState -> mutableStateFlow.update { currentState ->
updateLoginType(currentState) { updateLoginType(currentState) {
copy(totpCodeItemData = null) copy(totpCodeItemData = null)
} }
} }
// Only pull-to-refresh remains composeTestRule.onNode(isProgressBar).assertDoesNotExist()
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -1,7 +1,6 @@
package com.x8bit.bitwarden.ui.vault.feature.itemlisting package com.x8bit.bitwarden.ui.vault.feature.itemlisting
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.filterToOne
@ -581,9 +580,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() {
@Test @Test
fun `progressbar should be displayed according to state`() { fun `progressbar should be displayed according to state`() {
mutableStateFlow.update { DEFAULT_STATE } mutableStateFlow.update { DEFAULT_STATE }
composeTestRule.onNode(isProgressBar).assertIsDisplayed()
// There are 2 because of the pull-to-refresh
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2)
mutableStateFlow.update { mutableStateFlow.update {
it.copy( it.copy(
@ -595,9 +592,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() {
), ),
) )
} }
composeTestRule.onNode(isProgressBar).assertDoesNotExist()
// Only pull-to-refresh remains
composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1)
} }
@Test @Test

View File

@ -19,7 +19,7 @@ androdixAutofill = "1.3.0"
androidxBiometrics = "1.2.0-alpha05" androidxBiometrics = "1.2.0-alpha05"
androidxBrowser = "1.9.0" androidxBrowser = "1.9.0"
androidxCamera = "1.4.2" androidxCamera = "1.4.2"
androidxComposeBom = "2025.09.00" androidxComposeBom = "2025.09.01"
androidxCore = "1.17.0" androidxCore = "1.17.0"
androidxCredentials = "1.6.0-beta01" androidxCredentials = "1.6.0-beta01"
androidxCredentialsProviderEvents = "1.0.0-alpha03" androidxCredentialsProviderEvents = "1.0.0-alpha03"

View File

@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.union
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FabPosition import androidx.compose.material3.FabPosition
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.ScaffoldDefaults
@ -59,7 +58,6 @@ import com.bitwarden.ui.platform.util.rememberWindowSize
* The [overlay] is a nonstandard [Composable] that is placed over top the `utilityBar` and * The [overlay] is a nonstandard [Composable] that is placed over top the `utilityBar` and
* `content`. * `content`.
*/ */
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("LongMethod") @Suppress("LongMethod")
@Composable @Composable
fun BitwardenScaffold( fun BitwardenScaffold(

View File

@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.requiredSizeIn
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.PlainTooltip import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.TooltipScope import androidx.compose.material3.TooltipScope
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -42,7 +43,7 @@ fun TooltipScope.BitwardenToolTip(
) { ) {
PlainTooltip( PlainTooltip(
modifier = modifier.requiredSizeIn(minWidth = MIN_TOOLTIP_WIDTH), modifier = modifier.requiredSizeIn(minWidth = MIN_TOOLTIP_WIDTH),
caretSize = DpSize(width = 24.dp, height = 12.dp), caretShape = TooltipDefaults.caretShape(caretSize = DpSize(width = 24.dp, height = 12.dp)),
shape = BitwardenTheme.shapes.coachmark, shape = BitwardenTheme.shapes.coachmark,
contentColor = BitwardenTheme.colorScheme.text.primary, contentColor = BitwardenTheme.colorScheme.text.primary,
containerColor = BitwardenTheme.colorScheme.background.secondary, containerColor = BitwardenTheme.colorScheme.background.secondary,