From 76fb85ac1fd69be91215c377c8317f075e0c696b Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 7 May 2025 14:16:32 -0500 Subject: [PATCH] Update Compose BOM to 2025.04.01 (#5134) --- .../ui/platform/base/util/StringExtensions.kt | 4 +- .../action/BitwardenOverflowActionItem.kt | 2 - .../components/dialog/BitwardenBasicDialog.kt | 2 - .../BitwardenClientCertificateInfoDialog.kt | 2 - .../dialog/BitwardenDateSelectButton.kt | 3 +- .../dialog/BitwardenLoadingDialog.kt | 2 - .../dialog/BitwardenMasterPasswordDialog.kt | 2 - .../components/dialog/BitwardenPinDialog.kt | 2 - .../dialog/BitwardenSelectionDialog.kt | 17 ++++-- .../dialog/BitwardenTextEntryDialog.kt | 2 - .../dialog/BitwardenTimePickerDialog.kt | 2 - .../dialog/BitwardenTwoButtonDialog.kt | 3 - .../components/scaffold/BitwardenScaffold.kt | 3 +- .../accountsecurity/PinInputDialog.kt | 2 - .../vault/feature/item/VaultItemScreenTest.kt | 59 ++++++++++++------- .../qrcodescan/ChooseSaveLocationDialog.kt | 2 - .../dialog/BitwardenSelectionDialog.kt | 2 - .../components/scaffold/BitwardenScaffold.kt | 2 - gradle/libs.versions.toml | 2 +- 19 files changed, 56 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/base/util/StringExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/base/util/StringExtensions.kt index 0085e3cdbf..87ea61b52a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/base/util/StringExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/base/util/StringExtensions.kt @@ -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]) } /** diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/appbar/action/BitwardenOverflowActionItem.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/appbar/action/BitwardenOverflowActionItem.kt index d970b73086..dad389322b 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/appbar/action/BitwardenOverflowActionItem.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/appbar/action/BitwardenOverflowActionItem.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt index c6c0df8fd1..406505a860 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt @@ -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( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt index 5d85148c8c..5321562925 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt index 7ed164f256..8636ad1e97 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLoadingDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLoadingDialog.kt index 5c6eddf5f0..41985339c0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLoadingDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLoadingDialog.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt index 459dd6da76..c197d50914 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt index 1ad12ccd8e..fbb187c8a7 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt index 161d88b9ab..3a5f3c02c0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt @@ -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( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt index 471af40498..ed198ead88 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt @@ -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?, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt index d4f7e24593..ee21d33bab 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt @@ -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, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTwoButtonDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTwoButtonDialog.kt index ee406495e3..4fdaa6216a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTwoButtonDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTwoButtonDialog.kt @@ -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( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt index d3cf0a831f..ef79a63d71 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt @@ -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( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt index 0794e5d253..0e0fc9287d 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt @@ -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( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index 0cdfafd57d..5fc4d22775 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -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) { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/ChooseSaveLocationDialog.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/ChooseSaveLocationDialog.kt index ad6cb6e47d..985d71bd0c 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/ChooseSaveLocationDialog.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/ChooseSaveLocationDialog.kt @@ -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, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/dialog/BitwardenSelectionDialog.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/dialog/BitwardenSelectionDialog.kt index ed711af3c4..34327b7328 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/dialog/BitwardenSelectionDialog.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/dialog/BitwardenSelectionDialog.kt @@ -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, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/scaffold/BitwardenScaffold.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/scaffold/BitwardenScaffold.kt index ad599f4296..6309683c8e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/scaffold/BitwardenScaffold.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/scaffold/BitwardenScaffold.kt @@ -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, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 44670fce15..d689b74410 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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"