Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b77498f authored by Chaohui Wang's avatar Chaohui Wang
Browse files

[Spa] New SettingsCollapsibleCard

Fix: 305856149
Test: manual - with Gallery
Test: unit tests
Change-Id: I2db00b71e20f3266db7f6ffc2046661daf5ff967
parent 37f94a7e
Loading
Loading
Loading
Loading
+48 −11
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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,
@@ -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) {},
                    )
                )
            )
        )
    }
+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
+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.
@@ -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
+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(),
)
+32 −41
Original line number Diff line number Diff line
@@ -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
@@ -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(
@@ -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)
    }
}

@@ -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,
@@ -160,5 +150,6 @@ private fun SettingsCardPreview() {
                    CardButton(text = "Action", isMain = true) {},
                )
            )
        )
    }
}
Loading