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

Commit 228cb24a authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "[Spa] Use Material3Expressive IconButton" into main

parents 31768a1f b0f5cf11
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -23,10 +23,11 @@ object SettingsDimension {
    val paddingTiny = 2.dp
    val paddingExtraSmall = 4.dp
    val paddingExtraSmall1 = 6.dp
    val paddingSmall = if (isSpaExpressiveEnabled) 8.dp else 4.dp
    val paddingSmall1 = 16.dp
    val paddingExtraSmall3 = 6.dp
    val paddingExtraSmall5 = 10.dp
    val paddingExtraSmall6 = 12.dp
    val paddingSmall = if (isSpaExpressiveEnabled) 8.dp else 4.dp
    val paddingSmall1 = 16.dp
    val paddingLarge = 16.dp
    val paddingExtraLarge = 24.dp
    val paddingExtraLarge1 = 28.dp
+45 −37
Original line number Diff line number Diff line
@@ -25,20 +25,23 @@ import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
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.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.Launch
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.WarningAmber
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -48,6 +51,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@@ -93,46 +97,19 @@ fun ActionButtons(actionButtons: List<ActionButton>) {
    }
}

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
private fun RowScope.ActionButton(actionButton: ActionButton) {
    if (isSpaExpressiveEnabled) {
        FilledTonalButton(
            onClick = actionButton.onClick,
            modifier = Modifier
                .weight(1f)
                .fillMaxHeight()
                .clip(RoundedCornerShape(100.dp)),
            enabled = actionButton.enabled,
            // Because buttons could appear, disappear or change positions, reset the interaction source
            // to prevent highlight the wrong button.
            interactionSource = remember(actionButton) { MutableInteractionSource() },
            shape = RectangleShape,
            colors = ButtonDefaults.filledTonalButtonColors(
                containerColor = MaterialTheme.colorScheme.primaryContainer,
                contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
                disabledContainerColor = MaterialTheme.colorScheme.surface,
            ),
            contentPadding = PaddingValues(horizontal = 24.dp, vertical = 16.dp),
        ) {
        Column(horizontalAlignment = Alignment.CenterHorizontally) {
                Icon(
                    imageVector = actionButton.imageVector,
                    contentDescription = null,
                    modifier = Modifier.size(SettingsDimension.itemIconSize),
                )
                Box(
                    modifier = Modifier
                        .padding(top = 6.dp),
                    contentAlignment = Alignment.Center,
                ) {
            IconButton(actionButton)
            Spacer(Modifier.height(SettingsDimension.paddingExtraSmall3))
            Text(
                text = actionButton.text,
                        textAlign = TextAlign.Center,
                        style = MaterialTheme.typography.titleSmall,
                modifier = Modifier.clearAndSetSemantics {}, // semantics set in IconButton
                style = MaterialTheme.typography.titleSmallEmphasized,
            )
        }
            }
        }
    } else {
        FilledTonalButton(
            onClick = actionButton.onClick,
@@ -174,6 +151,37 @@ private fun RowScope.ActionButton(actionButton: ActionButton) {
    }
}

@Composable
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
private fun IconButton(actionButton: ActionButton) {
    FilledIconButton(
        onClick = actionButton.onClick,
        shape = IconButtonDefaults.mediumRoundShape,
        modifier =
            Modifier
                .size(
                    IconButtonDefaults.mediumContainerSize(
                        IconButtonDefaults.IconButtonWidthOption.Wide
                    )
                ),
        enabled = actionButton.enabled,
        // Because buttons could appear, disappear or change positions, reset the interaction source
        // to prevent highlight the wrong button.
        interactionSource = remember(actionButton) { MutableInteractionSource() },
        colors = IconButtonDefaults.filledIconButtonColors(
            containerColor = MaterialTheme.colorScheme.primaryContainer,
            contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
            disabledContainerColor = MaterialTheme.colorScheme.surface,
        ),
    ) {
        Icon(
            imageVector = actionButton.imageVector,
            contentDescription = actionButton.text,
            modifier = Modifier.size(SettingsDimension.itemIconSize),
        )
    }
}

@Composable
private fun ButtonDivider() {
    Box(