You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
7.3 KiB
Kotlin
215 lines
7.3 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
@file:OptIn(ExperimentalMaterialApi::class)
|
|
|
|
package org.mozilla.fenix.compose
|
|
|
|
import android.content.res.Configuration
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.layout.Arrangement
|
|
import androidx.compose.foundation.layout.Column
|
|
import androidx.compose.foundation.layout.Row
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.material.ChipDefaults.chipColors
|
|
import androidx.compose.material.ChipDefaults.filterChipColors
|
|
import androidx.compose.material.ExperimentalMaterialApi
|
|
import androidx.compose.material.FilterChip
|
|
import androidx.compose.material.Text
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
import androidx.compose.ui.unit.dp
|
|
import org.mozilla.fenix.compose.annotation.LightDarkPreview
|
|
import org.mozilla.fenix.theme.FirefoxTheme
|
|
|
|
/**
|
|
* Default layout for a clickable chip.
|
|
*
|
|
* @param text [String] displayed in this chip.
|
|
* @param modifier [Modifier] used to be applied to the layout of the chip.
|
|
* @param isSquare Optional [Boolean] to control whether the Chip's corners are square or rounded.
|
|
* @param backgroundColor Optional background [Color] for the chip.
|
|
* @param textColor Optional text [Color] for the chip.
|
|
* @param onClick Callback for when the user taps this chip.
|
|
*/
|
|
@OptIn(ExperimentalMaterialApi::class)
|
|
@Composable
|
|
private fun Chip(
|
|
text: String,
|
|
modifier: Modifier = Modifier,
|
|
isSquare: Boolean = false,
|
|
backgroundColor: Color = FirefoxTheme.colors.actionPrimary,
|
|
textColor: Color = FirefoxTheme.colors.textActionPrimary,
|
|
onClick: () -> Unit,
|
|
) {
|
|
androidx.compose.material.Chip(
|
|
onClick = onClick,
|
|
modifier = modifier,
|
|
shape = if (isSquare) RoundedCornerShape(4.dp) else RoundedCornerShape(25.dp),
|
|
colors = chipColors(
|
|
backgroundColor = backgroundColor,
|
|
),
|
|
) {
|
|
Text(
|
|
text = text,
|
|
color = textColor,
|
|
style = FirefoxTheme.typography.body2,
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Default layout of a selectable chip.
|
|
*
|
|
* @param text [String] displayed in this chip.
|
|
* @param isSelected Whether this should be shown as selected.
|
|
* @param isSquare Optional [Boolean] to control whether the Chip's corners are square or rounded.
|
|
* @param selectableChipColors The color set defined by [SelectableChipColors] used to style the chip.
|
|
* @param onClick Callback for when the user taps this chip.
|
|
*/
|
|
@Composable
|
|
fun SelectableChip(
|
|
text: String,
|
|
isSelected: Boolean,
|
|
isSquare: Boolean = false,
|
|
selectableChipColors: SelectableChipColors = SelectableChipColors.buildColors(),
|
|
onClick: () -> Unit,
|
|
) {
|
|
FilterChip(
|
|
selected = isSelected,
|
|
onClick = onClick,
|
|
shape = if (isSquare) RoundedCornerShape(4.dp) else RoundedCornerShape(25.dp),
|
|
colors = selectableChipColors.toMaterialChipColors(),
|
|
) {
|
|
Text(
|
|
text = text,
|
|
style = FirefoxTheme.typography.body2,
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Wrapper for the color parameters of [SelectableChip].
|
|
*
|
|
* @property selectedBackgroundColor Background [Color] when the chip is selected.
|
|
* @property unselectedBackgroundColor Background [Color] when the chip is not selected.
|
|
* @property selectedTextColor Text [Color] when the chip is selected.
|
|
* @property unselectedTextColor Text [Color] when the chip is not selected.
|
|
*/
|
|
data class SelectableChipColors(
|
|
val selectedBackgroundColor: Color,
|
|
val unselectedBackgroundColor: Color,
|
|
val selectedTextColor: Color,
|
|
val unselectedTextColor: Color,
|
|
) {
|
|
companion object {
|
|
|
|
/**
|
|
* Builder function used to construct an instance of [SelectableChipColors].
|
|
*/
|
|
@Composable
|
|
fun buildColors(
|
|
selectedBackgroundColor: Color = FirefoxTheme.colors.actionPrimary,
|
|
unselectedBackgroundColor: Color = FirefoxTheme.colors.actionTertiary,
|
|
selectedTextColor: Color = FirefoxTheme.colors.textActionPrimary,
|
|
unselectedTextColor: Color = FirefoxTheme.colors.textActionTertiary,
|
|
) = SelectableChipColors(
|
|
selectedBackgroundColor = selectedBackgroundColor,
|
|
unselectedBackgroundColor = unselectedBackgroundColor,
|
|
selectedTextColor = selectedTextColor,
|
|
unselectedTextColor = unselectedTextColor,
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Map applications' colors for selectable chips to the platform type.
|
|
*/
|
|
@Composable
|
|
private fun SelectableChipColors.toMaterialChipColors() = filterChipColors(
|
|
selectedBackgroundColor = selectedBackgroundColor,
|
|
backgroundColor = unselectedBackgroundColor,
|
|
selectedContentColor = selectedTextColor,
|
|
contentColor = unselectedTextColor,
|
|
)
|
|
|
|
@Composable
|
|
@LightDarkPreview
|
|
private fun ChipPreview() {
|
|
FirefoxTheme {
|
|
Column(
|
|
modifier = Modifier
|
|
.background(FirefoxTheme.colors.layer1),
|
|
verticalArrangement = Arrangement.SpaceEvenly,
|
|
) {
|
|
Chip(
|
|
text = "Chirp",
|
|
onClick = {},
|
|
)
|
|
|
|
Chip(
|
|
text = "SquareChip",
|
|
isSquare = true,
|
|
onClick = {},
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
@Preview(name = "Selectable Chip", uiMode = Configuration.UI_MODE_NIGHT_YES)
|
|
@Preview(name = "Selectable Chip", uiMode = Configuration.UI_MODE_NIGHT_NO)
|
|
private fun SelectableChipPreview() {
|
|
FirefoxTheme {
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.background(FirefoxTheme.colors.layer1),
|
|
horizontalArrangement = Arrangement.SpaceEvenly,
|
|
) {
|
|
SelectableChip(text = "ChirpOne", isSelected = false) {}
|
|
SelectableChip(text = "ChirpTwo", isSelected = true, isSquare = true) {}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
@Preview(name = "Custom Colors", uiMode = Configuration.UI_MODE_NIGHT_YES)
|
|
@Preview(name = "Custom Colors", uiMode = Configuration.UI_MODE_NIGHT_NO)
|
|
private fun SelectableChipWithCustomColorsPreview() {
|
|
FirefoxTheme {
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.background(FirefoxTheme.colors.layer1),
|
|
horizontalArrangement = Arrangement.SpaceEvenly,
|
|
) {
|
|
SelectableChip(
|
|
text = "Yellow",
|
|
isSelected = false,
|
|
selectableChipColors = SelectableChipColors(
|
|
selectedBackgroundColor = Color.Yellow,
|
|
unselectedBackgroundColor = Color.DarkGray,
|
|
selectedTextColor = Color.Black,
|
|
unselectedTextColor = Color.Gray,
|
|
),
|
|
) {}
|
|
|
|
SelectableChip(
|
|
text = "Cyan",
|
|
isSelected = true,
|
|
selectableChipColors = SelectableChipColors(
|
|
selectedBackgroundColor = Color.Cyan,
|
|
unselectedBackgroundColor = Color.DarkGray,
|
|
selectedTextColor = Color.Red,
|
|
unselectedTextColor = Color.Gray,
|
|
),
|
|
) {}
|
|
}
|
|
}
|
|
}
|