diff options
8 files changed, 492 insertions, 79 deletions
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt index ffd28798d82f..83d657ef380d 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt @@ -22,7 +22,7 @@ import com.android.settingslib.spa.framework.common.SettingsPageProviderReposito import com.android.settingslib.spa.framework.common.SpaEnvironment import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider -import com.android.settingslib.spa.gallery.card.CardPageProvider +import com.android.settingslib.spa.gallery.banner.BannerPageProvider import com.android.settingslib.spa.gallery.chart.ChartPageProvider import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider import com.android.settingslib.spa.gallery.dialog.NavDialogProvider @@ -107,7 +107,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) { SettingsTextFieldPasswordPageProvider, SearchScaffoldPageProvider, SuwScaffoldPageProvider, - CardPageProvider, + BannerPageProvider, CopyablePageProvider, ), rootPages = listOf( diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt index 5dd7cafb962a..6edd9173d7e5 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/banner/BannerPageProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.gallery.card +package com.android.settingslib.spa.gallery.banner import android.os.Bundle import androidx.compose.foundation.clickable @@ -46,39 +46,39 @@ import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R -import com.android.settingslib.spa.widget.card.CardButton -import com.android.settingslib.spa.widget.card.CardModel -import com.android.settingslib.spa.widget.card.SettingsCard -import com.android.settingslib.spa.widget.card.SettingsCardContent -import com.android.settingslib.spa.widget.card.SettingsCollapsibleCard +import com.android.settingslib.spa.widget.banner.BannerButton +import com.android.settingslib.spa.widget.banner.BannerModel +import com.android.settingslib.spa.widget.banner.SettingsBanner +import com.android.settingslib.spa.widget.banner.SettingsBannerContent +import com.android.settingslib.spa.widget.banner.SettingsCollapsibleBanner import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold -object CardPageProvider : SettingsPageProvider { - override val name = "Card" +object BannerPageProvider : SettingsPageProvider { + override val name = "Banner" override fun getTitle(arguments: Bundle?) = TITLE @Composable override fun Page(arguments: Bundle?) { RegularScaffold(title = TITLE) { - SettingsCardWithIcon() - SettingsCardWithoutIcon() - SampleSettingsCollapsibleCard() - SampleSettingsCardContent() + SettingsBannerWithIcon() + SettingsBannerWithoutIcon() + SampleSettingsCollapsibleBanner() + SampleSettingsBannerContent() } } @Composable - private fun SettingsCardWithIcon() { - SettingsCard( - CardModel( + private fun SettingsBannerWithIcon() { + SettingsBanner( + BannerModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.WarningAmber, buttons = listOf( - CardButton(text = "Action") {}, + BannerButton(text = "Action") {}, ), tintColor = MaterialTheme.colorScheme.error, containerColor = MaterialTheme.colorScheme.errorContainer, @@ -87,11 +87,11 @@ object CardPageProvider : SettingsPageProvider { } @Composable - private fun SettingsCardWithoutIcon() { + private fun SettingsBannerWithoutIcon() { val sampleTitle = stringResource(R.string.sample_title) var title by remember { mutableStateOf(sampleTitle) } - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = title, text = stringResource(R.string.sample_text), ) { title = "Clicked" } @@ -99,46 +99,46 @@ object CardPageProvider : SettingsPageProvider { } @Composable - fun SampleSettingsCollapsibleCard() { + fun SampleSettingsCollapsibleBanner() { val context = LocalContext.current var isVisible0 by rememberSaveable { mutableStateOf(true) } var isVisible1 by rememberSaveable { mutableStateOf(true) } - val cards = remember { + val banners = remember { mutableStateListOf( - CardModel( + BannerModel( title = context.getString(R.string.sample_title), text = context.getString(R.string.sample_text), imageVector = Icons.Outlined.PowerOff, isVisible = { isVisible0 }, onDismiss = { isVisible0 = false }, buttons = listOf( - CardButton(text = "Override") {}, - CardButton(text = "Learn more") {}, + BannerButton(text = "Override") {}, + BannerButton(text = "Learn more") {}, ), ), - CardModel( + BannerModel( title = context.getString(R.string.sample_title), text = context.getString(R.string.sample_text), imageVector = Icons.Outlined.Shield, isVisible = { isVisible1 }, onDismiss = { isVisible1 = false }, buttons = listOf( - CardButton(text = "Action") {}, + BannerButton(text = "Action") {}, ), ) ) } - SettingsCollapsibleCard( + SettingsCollapsibleBanner( title = "More alerts", imageVector = Icons.Outlined.Error, - models = cards.toList() + models = banners.toList() ) } @Composable - fun SampleSettingsCardContent() { - SettingsCard { - SettingsCardContent { + fun SampleSettingsBannerContent() { + SettingsBanner { + SettingsBannerContent { Box( Modifier .fillMaxWidth() @@ -148,7 +148,7 @@ object CardPageProvider : SettingsPageProvider { Text(text = "Abc") } } - SettingsCardContent { + SettingsBannerContent { Box( Modifier .fillMaxWidth() @@ -171,13 +171,13 @@ object CardPageProvider : SettingsPageProvider { } } - private const val TITLE = "Sample Card" + private const val TITLE = "Sample Banner" } @Preview @Composable -private fun CardPagePreview() { +private fun BannerPagePreview() { SettingsTheme { - CardPageProvider.Page(null) + BannerPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt index 654719d906a9..b1558cce718a 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePageProvider.kt @@ -28,7 +28,7 @@ import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R import com.android.settingslib.spa.gallery.SettingsPageProviderEnum import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider -import com.android.settingslib.spa.gallery.card.CardPageProvider +import com.android.settingslib.spa.gallery.banner.BannerPageProvider import com.android.settingslib.spa.gallery.chart.ChartPageProvider import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider @@ -73,7 +73,7 @@ object HomePageProvider : SettingsPageProvider { ChartPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), DialogMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), EditorMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), - CardPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + BannerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), CopyablePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), ) } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt new file mode 100644 index 000000000000..4ef258f24776 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/BannerModel.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.banner + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector + +data class BannerButton( + val text: String, + val contentDescription: String? = null, + val onClick: () -> Unit, +) + +data class BannerModel( + val title: String, + val text: String, + val imageVector: ImageVector? = null, + val isVisible: () -> Boolean = { true }, + + /** + * A dismiss button will be displayed if this is not null. + * + * And this callback will be called when user clicks the button. + */ + val onDismiss: (() -> Unit)? = null, + + val buttons: List<BannerButton> = emptyList(), + + /** If specified, this color will be used to tint the icon and the buttons. */ + val tintColor: Color = Color.Unspecified, + + /** If specified, this color will be used to tint the icon and the buttons. */ + val containerColor: Color = Color.Unspecified, + + val onClick: (() -> Unit)? = null, +) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt new file mode 100644 index 000000000000..e3f4860ee764 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsBanner.kt @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.banner + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.WarningAmber +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.takeOrElse +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.android.settingslib.spa.debug.UiModePreviews +import com.android.settingslib.spa.framework.compose.contentDescription +import com.android.settingslib.spa.framework.theme.SettingsDimension +import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge +import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall +import com.android.settingslib.spa.framework.theme.SettingsTheme +import com.android.settingslib.spa.widget.ui.SettingsBody +import com.android.settingslib.spa.widget.ui.SettingsTitle + +@Composable +fun SettingsBanner(content: @Composable ColumnScope.() -> Unit) { + Card( + shape = CornerExtraLarge, + colors = CardDefaults.cardColors( + containerColor = Color.Transparent, + ), + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = SettingsDimension.itemPaddingEnd, + vertical = SettingsDimension.itemPaddingAround, + ), + content = content, + ) +} + +@Composable +fun SettingsBannerContent( + containerColor: Color = Color.Unspecified, + content: @Composable ColumnScope.() -> Unit, +) { + Card( + shape = CornerExtraSmall, + colors = CardDefaults.cardColors( + containerColor = containerColor.takeOrElse { MaterialTheme.colorScheme.surface }, + ), + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 1.dp), + content = content, + ) +} + +@Composable +fun SettingsBanner(model: BannerModel) { + SettingsBanner { + SettingsBannerImpl(model) + } +} + +@Composable +internal fun SettingsBannerImpl(model: BannerModel) { + AnimatedVisibility(visible = model.isVisible()) { + SettingsBannerContent(containerColor = model.containerColor) { + Column( + modifier = (model.onClick?.let { Modifier.clickable(onClick = it) } ?: Modifier) + .padding( + horizontal = SettingsDimension.dialogItemPaddingHorizontal, + vertical = SettingsDimension.itemPaddingAround, + ), + verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround) + ) { + BannerHeader(model.imageVector, model.tintColor, model.onDismiss) + SettingsTitle(model.title) + SettingsBody(model.text) + Buttons(model.buttons, model.tintColor) + } + } + } +} + +@Composable +fun BannerHeader(imageVector: ImageVector?, iconColor: Color, onDismiss: (() -> Unit)? = null) { + if (imageVector != null || onDismiss != null) { + Spacer(Modifier.height(SettingsDimension.buttonPaddingVertical)) + } + Row(Modifier.fillMaxWidth()) { + BannerIcon(imageVector, iconColor) + Spacer(modifier = Modifier.weight(1f)) + DismissButton(onDismiss) + } +} + +@Composable +private fun BannerIcon(imageVector: ImageVector?, color: Color) { + if (imageVector != null) { + Icon( + imageVector = imageVector, + contentDescription = null, + modifier = Modifier.size(SettingsDimension.itemIconSize), + tint = color.takeOrElse { MaterialTheme.colorScheme.primary }, + ) + } +} + +@Composable +private fun DismissButton(onDismiss: (() -> Unit)?) { + if (onDismiss == null) return + Surface( + shape = CircleShape, + color = MaterialTheme.colorScheme.secondaryContainer, + ) { + IconButton( + onClick = onDismiss, + modifier = Modifier.size(SettingsDimension.itemIconSize) + ) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = stringResource( + androidx.compose.material3.R.string.m3c_snackbar_dismiss + ), + modifier = Modifier.padding(SettingsDimension.paddingSmall), + ) + } + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun Buttons(buttons: List<BannerButton>, color: Color) { + if (buttons.isNotEmpty()) { + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy( + space = SettingsDimension.itemPaddingEnd, + alignment = Alignment.End, + ), + ) { + for (button in buttons) { + Button(button, color) + } + } + } else { + Spacer(Modifier.height(SettingsDimension.itemPaddingAround)) + } +} + +@Composable +private fun Button(button: BannerButton, color: Color) { + TextButton( + onClick = button.onClick, + modifier = Modifier.contentDescription(button.contentDescription), + ) { + Text(text = button.text, color = color) + } +} + +@UiModePreviews +@Composable +private fun SettingsBannerPreview() { + SettingsTheme { + SettingsBanner( + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.WarningAmber, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ) + ) + } +} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt new file mode 100644 index 000000000000..31a1e9cd36a8 --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/banner/SettingsCollapsibleBanner.kt @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.banner + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Error +import androidx.compose.material.icons.outlined.PowerOff +import androidx.compose.material.icons.outlined.Shield +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +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.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import com.android.settingslib.spa.debug.UiModePreviews +import com.android.settingslib.spa.framework.theme.SettingsDimension +import com.android.settingslib.spa.framework.theme.SettingsShape +import com.android.settingslib.spa.framework.theme.SettingsTheme +import com.android.settingslib.spa.widget.ui.ExpandIcon +import com.android.settingslib.spa.widget.ui.SettingsDialogItem +import com.android.settingslib.spa.widget.ui.SettingsTitleSmall + +@Composable +fun SettingsCollapsibleBanner( + title: String, + imageVector: ImageVector, + models: List<BannerModel>, +) { + var expanded by rememberSaveable { mutableStateOf(false) } + SettingsBanner { + SettingsBannerContent { + Header(title, imageVector, models.count { it.isVisible() }, expanded) { expanded = it } + } + AnimatedVisibility(expanded) { + Column { + for (model in models) { + SettingsBannerImpl(model) + } + } + } + } +} + +@Composable +private fun Header( + title: String, + imageVector: ImageVector, + cardCount: Int, + expanded: Boolean, + setExpanded: (Boolean) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { setExpanded(!expanded) } + .padding( + horizontal = SettingsDimension.itemPaddingStart, + vertical = SettingsDimension.itemPaddingVertical, + ), + horizontalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingStart), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + imageVector = imageVector, + contentDescription = null, + modifier = Modifier.size(SettingsDimension.itemIconSize), + tint = MaterialTheme.colorScheme.primary, + ) + Box(modifier = Modifier.weight(1f)) { + SettingsTitleSmall(title, useMediumWeight = true) + } + BannerCount(cardCount, expanded) + } +} + +@Composable +private fun BannerCount(modelSize: Int, expanded: Boolean) { + Surface( + shape = SettingsShape.CornerExtraLarge, + color = MaterialTheme.colorScheme.secondaryContainer, + ) { + Row( + modifier = Modifier.padding(SettingsDimension.paddingSmall), + verticalAlignment = Alignment.CenterVertically, + ) { + Spacer(modifier = Modifier.padding(SettingsDimension.paddingSmall)) + SettingsDialogItem(modelSize.toString()) + ExpandIcon(expanded) + } + } +} + +@UiModePreviews +@Composable +private fun SettingsCollapsibleBannerPreview() { + SettingsTheme { + SettingsCollapsibleBanner( + title = "More alerts", + imageVector = Icons.Outlined.Error, + models = listOf( + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.PowerOff, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ), + BannerModel( + title = "Lorem ipsum", + text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + imageVector = Icons.Outlined.Shield, + buttons = listOf( + BannerButton(text = "Action") {}, + ) + ) + ) + ) + } +} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCardTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsBannerTest.kt index ffc7e86665dd..a8479b01a861 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCardTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsBannerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget.card +package com.android.settingslib.spa.widget.banner import android.content.Context import androidx.compose.runtime.getValue @@ -35,16 +35,16 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SettingsCardTest { +class SettingsBannerTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() @Test - fun settingsCard_titleDisplayed() { + fun settingsBanner_titleDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", ) @@ -55,10 +55,10 @@ class SettingsCardTest { } @Test - fun settingsCard_textDisplayed() { + fun settingsBanner_textDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = TEXT, ) @@ -69,13 +69,13 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonDisplayed() { + fun settingsBanner_buttonDisplayed() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton(text = TEXT) {}), + buttons = listOf(BannerButton(text = TEXT) {}), ) ) } @@ -84,14 +84,14 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonCanBeClicked() { + fun settingsBanner_buttonCanBeClicked() { var buttonClicked = false composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton(text = TEXT) { buttonClicked = true }), + buttons = listOf(BannerButton(text = TEXT) { buttonClicked = true }), ) ) } @@ -102,13 +102,13 @@ class SettingsCardTest { } @Test - fun settingsCard_buttonHaveContentDescription() { + fun settingsBanner_buttonHaveContentDescription() { composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = "", text = "", - buttons = listOf(CardButton( + buttons = listOf(BannerButton( text = TEXT, contentDescription = CONTENT_DESCRIPTION, ) {} @@ -121,11 +121,11 @@ class SettingsCardTest { } @Test - fun settingsCard_dismiss() { + fun settingsBanner_dismiss() { composeTestRule.setContent { var isVisible by remember { mutableStateOf(true) } - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", isVisible = { isVisible }, @@ -142,11 +142,11 @@ class SettingsCardTest { } @Test - fun settingsCard_clickable() { + fun settingsBanner_clickable() { var clicked by mutableStateOf(false) composeTestRule.setContent { - SettingsCard( - CardModel( + SettingsBanner( + BannerModel( title = TITLE, text = "", ) { clicked = true } diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCardTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleBannerTest.kt index aba9d7be1e91..1080fdea9455 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCardTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleBannerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget.card +package com.android.settingslib.spa.widget.banner import android.content.Context import androidx.compose.material.icons.Icons @@ -36,44 +36,44 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SettingsCollapsibleCardTest { +class SettingsCollapsibleBannerTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() @Test - fun settingsCollapsibleCard_titleDisplayed() { + fun settingsCollapsibleBanner_titleDisplayed() { setContent() composeTestRule.onNodeWithText(TITLE).assertIsDisplayed() } @Test - fun settingsCollapsibleCard_cardCountDisplayed() { + fun settingsCollapsibleBanner_BannerCountDisplayed() { setContent() composeTestRule.onNodeWithText("1").assertIsDisplayed() } @Test - fun settingsCollapsibleCard_initial_cardTextNotExists() { + fun settingsCollapsibleBanner_initial_BannerTextNotExists() { setContent() - composeTestRule.onNodeWithText(CARD_TEXT).assertDoesNotExist() + composeTestRule.onNodeWithText(Banner_TEXT).assertDoesNotExist() } @Test - fun settingsCollapsibleCard_afterExpand_cardTextDisplayed() { + fun settingsCollapsibleBanner_afterExpand_BannerTextDisplayed() { setContent() composeTestRule.onNodeWithText(TITLE).performClick() - composeTestRule.onNodeWithText(CARD_TEXT).assertIsDisplayed() + composeTestRule.onNodeWithText(Banner_TEXT).assertIsDisplayed() } @Test - fun settingsCollapsibleCard_dismiss() { + fun settingsCollapsibleBanner_dismiss() { setContent() composeTestRule.onNodeWithText(TITLE).performClick() @@ -81,20 +81,20 @@ class SettingsCollapsibleCardTest { context.getString(androidx.compose.material3.R.string.m3c_snackbar_dismiss) ).performClick() - composeTestRule.onNodeWithText(CARD_TEXT).isNotDisplayed() + composeTestRule.onNodeWithText(Banner_TEXT).isNotDisplayed() composeTestRule.onNodeWithText("0").assertIsDisplayed() } private fun setContent() { composeTestRule.setContent { var isVisible by rememberSaveable { mutableStateOf(true) } - SettingsCollapsibleCard( + SettingsCollapsibleBanner( title = TITLE, imageVector = Icons.Outlined.Error, models = listOf( - CardModel( + BannerModel( title = "", - text = CARD_TEXT, + text = Banner_TEXT, isVisible = { isVisible }, onDismiss = { isVisible = false }, ) @@ -105,6 +105,6 @@ class SettingsCollapsibleCardTest { private companion object { const val TITLE = "Title" - const val CARD_TEXT = "Card Text" + const val Banner_TEXT = "Banner Text" } } |