Refactor temporary buttons

This commit is contained in:
Andrew 2024-06-06 11:22:36 +09:30
parent c489765a50
commit b571348a66
4 changed files with 54 additions and 31 deletions

View File

@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.ui.classicDarkColors
import org.thoughtcrime.securesms.ui.components.AppBar import org.thoughtcrime.securesms.ui.components.AppBar
import org.thoughtcrime.securesms.ui.components.OnPrimaryButtons import org.thoughtcrime.securesms.ui.components.OnPrimaryButtons
import org.thoughtcrime.securesms.ui.components.OutlineButton import org.thoughtcrime.securesms.ui.components.OutlineButton
import org.thoughtcrime.securesms.ui.components.OutlineTemporaryStateButton
import org.thoughtcrime.securesms.ui.components.SmallButtons import org.thoughtcrime.securesms.ui.components.SmallButtons
import org.thoughtcrime.securesms.ui.components.TemporaryStateButton import org.thoughtcrime.securesms.ui.components.TemporaryStateButton
import org.thoughtcrime.securesms.ui.contentDescription import org.thoughtcrime.securesms.ui.contentDescription
@ -96,23 +97,21 @@ class InviteFriendFragment : Fragment() {
SmallButtons { SmallButtons {
Row(horizontalArrangement = spacedBy(20.dp)) { Row(horizontalArrangement = spacedBy(20.dp)) {
OutlineButton( OutlineButton(
modifier = Modifier.weight(1f) modifier = Modifier
.weight(1f)
.contentDescription("Share button"), .contentDescription("Share button"),
onClick = { requireContext().sendInvitation() } onClick = { requireContext().sendInvitation() }
) { ) {
Text(stringResource(R.string.share)) Text(stringResource(R.string.share))
} }
TemporaryStateButton { source, isTemporary -> OutlineTemporaryStateButton(
OutlineButton( Modifier
modifier = Modifier.weight(1f) .weight(1f)
.contentDescription("Copy button"), .contentDescription("Copy button"),
interactionSource = source, onClick = { requireContext().copyPublicKey() }
onClick = { requireContext().copyPublicKey() }, ) { isTemporary ->
) { Text(stringResource(if (isTemporary) R.string.copied else R.string.copy))
AnimatedVisibility(isTemporary) { Text(stringResource(R.string.copied)) }
AnimatedVisibility(!isTemporary) { Text(stringResource(R.string.copy)) }
}
} }
} }
} }

View File

@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
import org.thoughtcrime.securesms.ui.classicDarkColors import org.thoughtcrime.securesms.ui.classicDarkColors
import org.thoughtcrime.securesms.ui.components.DestructiveButtons import org.thoughtcrime.securesms.ui.components.DestructiveButtons
import org.thoughtcrime.securesms.ui.components.OutlineButton import org.thoughtcrime.securesms.ui.components.OutlineButton
import org.thoughtcrime.securesms.ui.components.OutlineTemporaryStateButton
import org.thoughtcrime.securesms.ui.components.QrImage import org.thoughtcrime.securesms.ui.components.QrImage
import org.thoughtcrime.securesms.ui.components.SmallButtons import org.thoughtcrime.securesms.ui.components.SmallButtons
import org.thoughtcrime.securesms.ui.components.TemporaryStateButton import org.thoughtcrime.securesms.ui.components.TemporaryStateButton
@ -172,16 +173,13 @@ fun RecoveryPasswordCell(seed: String, copySeed:() -> Unit = {}) {
AnimatedVisibility(!showQr) { AnimatedVisibility(!showQr) {
Row(horizontalArrangement = Arrangement.spacedBy(32.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(32.dp)) {
TemporaryStateButton { source, isTemporary -> OutlineTemporaryStateButton(
OutlineButton( Modifier
modifier = Modifier.weight(1f) .weight(1f)
.contentDescription(R.string.AccessibilityId_copy_button), .contentDescription(R.string.AccessibilityId_copy_button),
interactionSource = source, onClick = copySeed
onClick = copySeed, ) { isTemporary ->
) { Text(stringResource( if (isTemporary) R.string.copied else R.string.copy))
AnimatedVisibility(isTemporary) { Text(stringResource(R.string.copied)) }
AnimatedVisibility(!isTemporary) { Text(stringResource(R.string.copy)) }
}
} }
OutlineButton(textId = R.string.qrView, modifier = Modifier.weight(1f), onClick = { showQr = !showQr }) OutlineButton(textId = R.string.qrView, modifier = Modifier.weight(1f), onClick = { showQr = !showQr })
} }

View File

@ -81,6 +81,7 @@ import org.thoughtcrime.securesms.ui.Divider
import org.thoughtcrime.securesms.ui.ItemButton import org.thoughtcrime.securesms.ui.ItemButton
import org.thoughtcrime.securesms.ui.ItemButtonWithDrawable import org.thoughtcrime.securesms.ui.ItemButtonWithDrawable
import org.thoughtcrime.securesms.ui.components.OutlineButton import org.thoughtcrime.securesms.ui.components.OutlineButton
import org.thoughtcrime.securesms.ui.components.OutlineTemporaryStateButton
import org.thoughtcrime.securesms.ui.components.TemporaryStateButton import org.thoughtcrime.securesms.ui.components.TemporaryStateButton
import org.thoughtcrime.securesms.ui.destructiveButtonColors import org.thoughtcrime.securesms.ui.destructiveButtonColors
import org.thoughtcrime.securesms.util.BitmapDecodingException import org.thoughtcrime.securesms.util.BitmapDecodingException
@ -388,7 +389,9 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
fun Buttons() { fun Buttons() {
Column { Column {
Row( Row(
modifier = Modifier.padding(horizontal = 24.dp).padding(top = 8.dp), modifier = Modifier
.padding(horizontal = 24.dp)
.padding(top = 8.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp),
) { ) {
OutlineButton( OutlineButton(
@ -398,15 +401,11 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
Text(stringResource(R.string.share)) Text(stringResource(R.string.share))
} }
TemporaryStateButton { source, temporary -> OutlineTemporaryStateButton(
OutlineButton(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
interactionSource = source,
onClick = { copyPublicKey() }, onClick = { copyPublicKey() },
) { ) { isTemporary ->
AnimatedVisibility(temporary) { Text(stringResource(R.string.copied)) } Text(stringResource(if (isTemporary) R.string.copied else R.string.copy))
AnimatedVisibility(!temporary) { Text(stringResource(R.string.copy)) }
}
} }
} }

View File

@ -1,6 +1,13 @@
package org.thoughtcrime.securesms.ui.components package org.thoughtcrime.securesms.ui.components
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideIn
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.interaction.PressInteraction
@ -32,6 +39,8 @@ import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import network.loki.messenger.R
import org.thoughtcrime.securesms.preferences.copyPublicKey
import org.thoughtcrime.securesms.ui.GetString import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.LaunchedEffectAsync import org.thoughtcrime.securesms.ui.LaunchedEffectAsync
import org.thoughtcrime.securesms.ui.LocalButtonColor import org.thoughtcrime.securesms.ui.LocalButtonColor
@ -80,6 +89,24 @@ fun OutlineButton(
} }
} }
@Composable
fun OutlineTemporaryStateButton(
modifier: Modifier = Modifier,
onClick: () -> Unit = {},
content: @Composable (Boolean) -> Unit,
) {
TemporaryStateButton { source, isTemporary ->
OutlineButton(
modifier = modifier,
interactionSource = source,
onClick = onClick,
) {
AnimatedVisibility(isTemporary) { content(true) }
AnimatedVisibility(!isTemporary) { content(false) }
}
}
}
@Composable @Composable
fun TemporaryStateButton( fun TemporaryStateButton(
content: @Composable (MutableInteractionSource, Boolean) -> Unit, content: @Composable (MutableInteractionSource, Boolean) -> Unit,