From 2a134c619d87f942432c8940810a506e1dc54494 Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 29 Sep 2025 14:21:36 -0500 Subject: [PATCH] Update the Compose BOM (#5957) --- .../LoginWithDeviceScreenTest.kt | 7 ++---- .../feature/search/SearchScreenTest.kt | 7 ++---- .../recordedlogs/RecordedLogsScreenTest.kt | 4 +--- .../ui/tools/feature/send/SendScreenTest.kt | 13 ++++------ .../send/addedit/AddEditSendScreenTest.kt | 10 +++----- .../send/viewsend/ViewSendScreenTest.kt | 7 ++---- .../feature/addedit/VaultAddEditScreenTest.kt | 9 +++---- .../attachments/AttachmentsScreenTest.kt | 10 +++----- .../vault/feature/item/VaultItemScreenTest.kt | 24 +++++++------------ .../itemlisting/VaultItemListingScreenTest.kt | 9 ++----- gradle/libs.versions.toml | 2 +- .../components/scaffold/BitwardenScaffold.kt | 2 -- .../components/tooltip/BitwardenToolTip.kt | 3 ++- 13 files changed, 33 insertions(+), 74 deletions(-) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt index 5dda393dc6..d775790033 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.auth.feature.loginwithdevice import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.isDialog @@ -117,14 +116,12 @@ class LoginWithDeviceScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy(viewState = LoginWithDeviceState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = DEFAULT_STATE.viewState) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt index d69f0461ca..44c9602e01 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.platform.feature.search import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.filterToOne @@ -181,15 +180,13 @@ class SearchScreenTest : BitwardenComposeTest() { @Test fun `progressbar should be displayed according to state`() { mutableStateFlow.update { DEFAULT_STATE } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = SearchState.ViewState.Empty(message = null)) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt index a7fff61981..47e38fa4ec 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt @@ -1,6 +1,5 @@ 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.assertIsEnabled import androidx.compose.ui.test.assertIsNotEnabled @@ -103,8 +102,7 @@ class RecordedLogsScreenTest : BitwardenComposeTest() { @Test fun `UI should change based on ViewState`() { mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = RecordedLogsState.ViewState.Empty) } composeTestRule.onNodeWithText(text = "No logs recorded").assertIsDisplayed() diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreenTest.kt index f2c8db1f07..0e54d5619c 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.tools.feature.send import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.filterToOne @@ -306,26 +305,22 @@ class SendScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy(viewState = SendState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = SendState.ViewState.Empty) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { it.copy(viewState = SendState.ViewState.Error("Fail".asText())) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { it.copy(viewState = DEFAULT_CONTENT_VIEW_STATE) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt index d287b809b3..ca60b626a6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.tools.feature.send.addedit import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed @@ -731,20 +730,17 @@ class AddEditSendScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy(viewState = AddEditSendState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = AddEditSendState.ViewState.Error("Fail".asText())) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { it.copy(viewState = DEFAULT_VIEW_STATE) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreenTest.kt index b8578ae23b..f4a9bea653 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.tools.feature.send.viewsend import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.hasAnyAncestor @@ -171,12 +170,10 @@ class ViewSendScreenTest : BitwardenComposeTest() { @Test fun `progress bar should be displayed based on ViewState`() { mutableStateFlow.update { it.copy(viewState = ViewSendState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = DEFAULT_STATE.viewState) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt index e610e09c4b..55cc0dce48 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt @@ -618,14 +618,12 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy(viewState = VaultAddEditState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = VaultAddEditState.ViewState.Error("Fail".asText())) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { it.copy( @@ -636,8 +634,7 @@ class VaultAddEditScreenTest : BitwardenComposeTest() { ), ) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreenTest.kt index 187a2386fa..69e2171181 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.vault.feature.attachments import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.filterToOne import androidx.compose.ui.test.hasAnyAncestor @@ -92,20 +91,17 @@ class AttachmentsScreenTest : BitwardenComposeTest() { @Test fun `progressbar should be displayed according to state`() { mutableStateFlow.update { it.copy(viewState = AttachmentsState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = AttachmentsState.ViewState.Error("Fail".asText())) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { it.copy(viewState = DEFAULT_CONTENT_WITHOUT_ATTACHMENTS) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 7c05219df5..da77ac8203 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -2045,8 +2045,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { ) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() composeTestRule .onNodeWithText("Passkey") @@ -2091,8 +2090,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { ) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() composeTestRule .onNodeWithContentDescription("Copy TOTP") @@ -2113,8 +2111,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { } composeTestRule.onNodeWithTextAfterScroll("Authenticator key") - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() composeTestRule .onNodeWithContentDescription("Copy TOTP") @@ -2130,8 +2127,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { } composeTestRule.onNodeWithTextAfterScroll("Authenticator key") - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() composeTestRule .onNodeWithContentDescriptionAfterScroll("Copy TOTP") @@ -2148,8 +2144,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { } composeTestRule.onNodeWithTextAfterScroll("Authenticator key") - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() composeTestRule .onNodeWithContentDescription("Copy TOTP") @@ -2351,22 +2346,19 @@ class VaultItemScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy(viewState = VaultItemState.ViewState.Loading) } - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy(viewState = VaultItemState.ViewState.Error("Fail".asText())) } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() mutableStateFlow.update { currentState -> updateLoginType(currentState) { copy(totpCodeItemData = null) } } - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt index dff0c33503..cb00d14a37 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting import androidx.compose.ui.test.assert -import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.filterToOne @@ -581,9 +580,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { @Test fun `progressbar should be displayed according to state`() { mutableStateFlow.update { DEFAULT_STATE } - - // There are 2 because of the pull-to-refresh - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(2) + composeTestRule.onNode(isProgressBar).assertIsDisplayed() mutableStateFlow.update { it.copy( @@ -595,9 +592,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { ), ) } - - // Only pull-to-refresh remains - composeTestRule.onAllNodes(isProgressBar).assertCountEquals(1) + composeTestRule.onNode(isProgressBar).assertDoesNotExist() } @Test diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc31b9c7f2..c82220f9bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,7 @@ androdixAutofill = "1.3.0" androidxBiometrics = "1.2.0-alpha05" androidxBrowser = "1.9.0" androidxCamera = "1.4.2" -androidxComposeBom = "2025.09.00" +androidxComposeBom = "2025.09.01" androidxCore = "1.17.0" androidxCredentials = "1.6.0-beta01" androidxCredentialsProviderEvents = "1.0.0-alpha03" diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt index d169b36464..97c6a13775 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt @@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.union import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FabPosition import androidx.compose.material3.Scaffold 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 * `content`. */ -@OptIn(ExperimentalMaterial3Api::class) @Suppress("LongMethod") @Composable fun BitwardenScaffold( diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt index 23e65198f5..e8017b3216 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.requiredSizeIn import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.PlainTooltip import androidx.compose.material3.Text +import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TooltipScope import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -42,7 +43,7 @@ fun TooltipScope.BitwardenToolTip( ) { PlainTooltip( 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, contentColor = BitwardenTheme.colorScheme.text.primary, containerColor = BitwardenTheme.colorScheme.background.secondary,