Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt +48 −11 Original line number Diff line number Diff line Loading @@ -18,6 +18,9 @@ package com.android.settingslib.spa.gallery.card import android.os.Bundle 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.material.icons.outlined.WarningAmber import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource Loading @@ -29,13 +32,15 @@ import com.android.settingslib.spa.framework.compose.navigator 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.SettingsCollapsibleCard 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 = "ActionButton" override val name = "CardPage" override fun getTitle(arguments: Bundle?) = TITLE Loading @@ -44,12 +49,14 @@ object CardPageProvider : SettingsPageProvider { RegularScaffold(title = TITLE) { SettingsCardWithIcon() SettingsCardWithoutIcon() SampleSettingsCollapsibleCard() } } @Composable private fun SettingsCardWithIcon() { SettingsCard( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.WarningAmber, Loading @@ -58,15 +65,45 @@ object CardPageProvider : SettingsPageProvider { CardButton(text = "Action", isMain = true) {}, ) ) ) } @Composable private fun SettingsCardWithoutIcon() { SettingsCard( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), buttons = listOf( CardButton(text = "Action") {}, ), ) ) } @Composable fun SampleSettingsCollapsibleCard() { SettingsCollapsibleCard( title = "More alerts", imageVector = Icons.Outlined.Error, models = listOf( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.PowerOff, buttons = listOf( CardButton(text = "Action") {}, ) ), CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.Shield, buttons = listOf( CardButton(text = "Action") {}, CardButton(text = "Main action", isMain = true) {}, ) ) ) ) } Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/debug/UiModePreviews.kt 0 → 100644 +24 −0 Original line number Diff line number Diff line /* * 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.debug import android.content.res.Configuration import androidx.compose.ui.tooling.preview.Preview @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) annotation class UiModePreviews packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt +3 −1 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * 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. Loading @@ -20,6 +20,8 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.ui.unit.dp object SettingsDimension { val paddingSmall = 4.dp val itemIconSize = 24.dp val itemIconContainerSize = 72.dp val itemPaddingStart = 24.dp Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/CardModel.kt 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * 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.card import androidx.compose.ui.graphics.vector.ImageVector data class CardButton( val text: String, val isMain: Boolean = false, val onClick: () -> Unit, ) data class CardModel( val title: String, val text: String, val imageVector: ImageVector? = null, val buttons: List<CardButton> = emptyList(), ) packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt +32 −41 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ package com.android.settingslib.spa.widget.card import android.content.res.Configuration import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding Loading @@ -37,26 +37,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.debug.UiModePreviews import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.widget.ui.SettingsBody import com.android.settingslib.spa.widget.ui.SettingsTitle data class CardButton( val text: String, val isMain: Boolean = false, val onClick: () -> Unit, ) @Composable fun SettingsCard( title: String, text: String, imageVector: ImageVector? = null, buttons: List<CardButton> = emptyList(), ) { fun SettingsCard(content: @Composable ColumnScope.() -> Unit) { Card( shape = CornerExtraLarge, colors = CardDefaults.cardColors( Loading @@ -68,16 +57,27 @@ fun SettingsCard( horizontal = SettingsDimension.itemPaddingEnd, vertical = SettingsDimension.itemPaddingAround, ), ) { content = content, ) } @Composable fun SettingsCard(model: CardModel) { SettingsCard { SettingsCardImpl(model) } } @Composable internal fun SettingsCardImpl(model: CardModel) { Column( modifier = Modifier.padding(SettingsDimension.itemPaddingStart), verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround) ) { CardIcon(imageVector) SettingsTitle(title) SettingsBody(text) Buttons(buttons) } CardIcon(model.imageVector) SettingsTitle(model.title) SettingsBody(model.text) Buttons(model.buttons) } } Loading Loading @@ -136,22 +136,12 @@ private fun Button(button: CardButton) { } } @Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) @Composable private fun SettingsCardPreviewLight() { SettingsCardPreview() } @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable private fun SettingsCardPreviewDark() { SettingsCardPreview() } @UiModePreviews @Composable private fun SettingsCardPreview() { SettingsTheme { SettingsCard( CardModel( title = "Lorem ipsum", text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", imageVector = Icons.Outlined.WarningAmber, Loading @@ -160,5 +150,6 @@ private fun SettingsCardPreview() { CardButton(text = "Action", isMain = true) {}, ) ) ) } } Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt +48 −11 Original line number Diff line number Diff line Loading @@ -18,6 +18,9 @@ package com.android.settingslib.spa.gallery.card import android.os.Bundle 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.material.icons.outlined.WarningAmber import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource Loading @@ -29,13 +32,15 @@ import com.android.settingslib.spa.framework.compose.navigator 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.SettingsCollapsibleCard 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 = "ActionButton" override val name = "CardPage" override fun getTitle(arguments: Bundle?) = TITLE Loading @@ -44,12 +49,14 @@ object CardPageProvider : SettingsPageProvider { RegularScaffold(title = TITLE) { SettingsCardWithIcon() SettingsCardWithoutIcon() SampleSettingsCollapsibleCard() } } @Composable private fun SettingsCardWithIcon() { SettingsCard( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.WarningAmber, Loading @@ -58,15 +65,45 @@ object CardPageProvider : SettingsPageProvider { CardButton(text = "Action", isMain = true) {}, ) ) ) } @Composable private fun SettingsCardWithoutIcon() { SettingsCard( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), buttons = listOf( CardButton(text = "Action") {}, ), ) ) } @Composable fun SampleSettingsCollapsibleCard() { SettingsCollapsibleCard( title = "More alerts", imageVector = Icons.Outlined.Error, models = listOf( CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.PowerOff, buttons = listOf( CardButton(text = "Action") {}, ) ), CardModel( title = stringResource(R.string.sample_title), text = stringResource(R.string.sample_text), imageVector = Icons.Outlined.Shield, buttons = listOf( CardButton(text = "Action") {}, CardButton(text = "Main action", isMain = true) {}, ) ) ) ) } Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/debug/UiModePreviews.kt 0 → 100644 +24 −0 Original line number Diff line number Diff line /* * 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.debug import android.content.res.Configuration import androidx.compose.ui.tooling.preview.Preview @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) annotation class UiModePreviews
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsDimension.kt +3 −1 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * 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. Loading @@ -20,6 +20,8 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.ui.unit.dp object SettingsDimension { val paddingSmall = 4.dp val itemIconSize = 24.dp val itemIconContainerSize = 72.dp val itemPaddingStart = 24.dp Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/CardModel.kt 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * 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.card import androidx.compose.ui.graphics.vector.ImageVector data class CardButton( val text: String, val isMain: Boolean = false, val onClick: () -> Unit, ) data class CardModel( val title: String, val text: String, val imageVector: ImageVector? = null, val buttons: List<CardButton> = emptyList(), )
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt +32 −41 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ package com.android.settingslib.spa.widget.card import android.content.res.Configuration import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding Loading @@ -37,26 +37,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.debug.UiModePreviews import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.widget.ui.SettingsBody import com.android.settingslib.spa.widget.ui.SettingsTitle data class CardButton( val text: String, val isMain: Boolean = false, val onClick: () -> Unit, ) @Composable fun SettingsCard( title: String, text: String, imageVector: ImageVector? = null, buttons: List<CardButton> = emptyList(), ) { fun SettingsCard(content: @Composable ColumnScope.() -> Unit) { Card( shape = CornerExtraLarge, colors = CardDefaults.cardColors( Loading @@ -68,16 +57,27 @@ fun SettingsCard( horizontal = SettingsDimension.itemPaddingEnd, vertical = SettingsDimension.itemPaddingAround, ), ) { content = content, ) } @Composable fun SettingsCard(model: CardModel) { SettingsCard { SettingsCardImpl(model) } } @Composable internal fun SettingsCardImpl(model: CardModel) { Column( modifier = Modifier.padding(SettingsDimension.itemPaddingStart), verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround) ) { CardIcon(imageVector) SettingsTitle(title) SettingsBody(text) Buttons(buttons) } CardIcon(model.imageVector) SettingsTitle(model.title) SettingsBody(model.text) Buttons(model.buttons) } } Loading Loading @@ -136,22 +136,12 @@ private fun Button(button: CardButton) { } } @Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) @Composable private fun SettingsCardPreviewLight() { SettingsCardPreview() } @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable private fun SettingsCardPreviewDark() { SettingsCardPreview() } @UiModePreviews @Composable private fun SettingsCardPreview() { SettingsTheme { SettingsCard( CardModel( title = "Lorem ipsum", text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", imageVector = Icons.Outlined.WarningAmber, Loading @@ -160,5 +150,6 @@ private fun SettingsCardPreview() { CardButton(text = "Action", isMain = true) {}, ) ) ) } }