This commit is contained in:
Andrew 2024-06-14 15:18:41 +09:30
parent 351f2d9c57
commit b63f63585b
4 changed files with 69 additions and 125 deletions

View File

@ -165,9 +165,8 @@ fun RecoveryPasswordCell(seed: String, copySeed:() -> Unit = {}) {
)
SlimOutlineButton(
stringResource(R.string.qrView),
modifier = Modifier.weight(1f),
onClick = { showQr = !showQr }
)
Modifier.weight(1f),
) { showQr = !showQr }
}
}

View File

@ -9,8 +9,9 @@ import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp
fun boldStyle(size: TextUnit) = TextStyle.Default.copy(
fontSize = size,
lineHeight = size * 1.2,
fontWeight = FontWeight.Bold,
fontSize = size
)
fun defaultStyle(size: TextUnit, fontFamily: FontFamily? = TextStyle.Default.fontFamily) = TextStyle.Default.copy(
@ -20,6 +21,7 @@ fun defaultStyle(size: TextUnit, fontFamily: FontFamily? = TextStyle.Default.fon
)
val xl = defaultStyle(18.sp)
val large = defaultStyle(16.sp)
val base = defaultStyle(14.sp)

View File

@ -4,16 +4,14 @@ import android.annotation.SuppressLint
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.LocalMinimumInteractiveComponentEnforcement
import androidx.compose.material.LocalTextStyle
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import org.thoughtcrime.securesms.ui.baseBold
import org.thoughtcrime.securesms.ui.extraSmall
import org.thoughtcrime.securesms.ui.extraSmallBold
import org.thoughtcrime.securesms.ui.smallBold
interface ButtonSize {
@OptIn(ExperimentalMaterialApi::class)
@ -36,11 +34,6 @@ object LargeButtonSize: ButtonSize {
override val minHeight = 41.dp
}
object MediumButtonSize: ButtonSize {
override val textStyle @Composable get() = smallBold
override val minHeight = 34.dp
}
object SlimButtonSize: ButtonSize {
override val textStyle @Composable get() = extraSmallBold
override val minHeight = 29.dp

View File

@ -33,119 +33,6 @@ import org.thoughtcrime.securesms.ui.contentDescription
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
//@Composable
//fun OutlineButton(
// text: String,
// modifier: Modifier = Modifier,
// size: ButtonSize = LargeButtonSize,
// color: Color = LocalPalette.current.buttonOutline,
// onClick: () -> Unit
//) {
// OutlineButton(
// modifier = modifier,
// size = size,
// color = color,
// onClick = onClick
// ) {
// SessionButtonText(text = text, style = size.textStyle, color = color)
// }
//}
//
///**
// * Base implementation of [SessionOutlinedButton]
// */
//@Composable
//fun OutlineButton(
// modifier: Modifier = Modifier,
// size: ButtonSize = LargeButtonSize,
// enabled: Boolean = true,
// interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
// color: Color = LocalPalette.current.buttonOutline,
// border: BorderStroke = BorderStroke(1.dp, if (enabled) color else LocalPalette.current.disabled),
// shape: Shape = MaterialTheme.shapes.small,
// onClick: () -> Unit,
// content: @Composable () -> Unit = {}
//) {
// Button(
// modifier = modifier.heightIn(min = size.minHeight),
// enabled = enabled,
// interactionSource = interactionSource,
// onClick = onClick,
// border = border,
// shape = shape,
// type = ButtonType.Outline,
// color = color
// ) {
// size.applyTextStyle {
// content()
// }
// }
//}
@Composable
fun SlimOutlineCopyButton(
modifier: Modifier = Modifier,
color: Color = LocalPalette.current.buttonOutline,
onClick: () -> Unit
) {
OutlineCopyButton(modifier, SlimButtonSize, color, onClick)
}
@Composable
fun OutlineCopyButton(
modifier: Modifier = Modifier,
size: ButtonSize = LargeButtonSize,
color: Color = LocalPalette.current.buttonOutline,
onClick: () -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
Button(
modifier = modifier.contentDescription(R.string.AccessibilityId_copy_button),
interactionSource = interactionSource,
size = size,
type = ButtonType.Outline,
color = color,
onClick = onClick
) {
TemporaryClickedContent(
interactionSource = interactionSource,
content = { Text(stringResource(R.string.copy)) },
temporaryContent = { Text(stringResource(R.string.copied)) }
)
}
}
@Composable
fun TemporaryClickedContent(
modifier: Modifier = Modifier,
interactionSource: MutableInteractionSource,
content: @Composable () -> Unit,
temporaryContent: @Composable () -> Unit,
temporaryDelay: Duration = 2.seconds
) {
var clicked by remember { mutableStateOf(false) }
LaunchedEffectAsync {
interactionSource.releases.collectLatest {
clicked = true
delay(temporaryDelay)
clicked = false
}
}
// Using a Box because the Buttons add children in a Row
// and they will jank as they are added and removed.
Box(contentAlignment = Alignment.Center) {
AnimatedVisibility(!clicked, enter = fadeIn(), exit = fadeOut()) {
content()
}
AnimatedVisibility(clicked, enter = fadeIn(), exit = fadeOut()) {
temporaryContent()
}
}
}
interface ButtonType {
@Composable fun border(color: Color, enabled: Boolean): BorderStroke?
@Composable fun buttonColors(color: Color): ButtonColors
@ -252,3 +139,66 @@ fun Button(
@Composable fun SlimOutlineButton(onClick: () -> Unit, modifier: Modifier = Modifier, color: Color = LocalPalette.current.buttonOutline, enabled: Boolean = true, content: @Composable () -> Unit) {
Button(onClick, color, ButtonType.Outline, modifier, enabled, SlimButtonSize) { content() }
}
@Composable
fun SlimOutlineCopyButton(
modifier: Modifier = Modifier,
color: Color = LocalPalette.current.buttonOutline,
onClick: () -> Unit
) {
OutlineCopyButton(modifier, SlimButtonSize, color, onClick)
}
@Composable
fun OutlineCopyButton(
modifier: Modifier = Modifier,
size: ButtonSize = LargeButtonSize,
color: Color = LocalPalette.current.buttonOutline,
onClick: () -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
Button(
modifier = modifier.contentDescription(R.string.AccessibilityId_copy_button),
interactionSource = interactionSource,
size = size,
type = ButtonType.Outline,
color = color,
onClick = onClick
) {
TemporaryClickedContent(
interactionSource = interactionSource,
content = { Text(stringResource(R.string.copy)) },
temporaryContent = { Text(stringResource(R.string.copied)) }
)
}
}
@Composable
fun TemporaryClickedContent(
interactionSource: MutableInteractionSource,
content: @Composable () -> Unit,
temporaryContent: @Composable () -> Unit,
temporaryDelay: Duration = 2.seconds
) {
var clicked by remember { mutableStateOf(false) }
LaunchedEffectAsync {
interactionSource.releases.collectLatest {
clicked = true
delay(temporaryDelay)
clicked = false
}
}
// Using a Box because the Buttons add children in a Row
// and they will jank as they are added and removed.
Box(contentAlignment = Alignment.Center) {
AnimatedVisibility(!clicked, enter = fadeIn(), exit = fadeOut()) {
content()
}
AnimatedVisibility(clicked, enter = fadeIn(), exit = fadeOut()) {
temporaryContent()
}
}
}