SES-2220 Tweak Mesage notifications

This commit is contained in:
Andrew 2024-06-25 12:23:06 +09:30
parent 287b5566c4
commit a9fdf9a733
2 changed files with 79 additions and 20 deletions

View File

@ -1,20 +1,32 @@
package org.thoughtcrime.securesms.onboarding.messagenotifications package org.thoughtcrime.securesms.onboarding.messagenotifications
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.BorderStroke import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Arrangement import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ButtonDefaults import androidx.compose.material.IconButton
import androidx.compose.material.RadioButton
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
@ -27,7 +39,6 @@ import org.thoughtcrime.securesms.ui.SessionColorsParameterProvider
import org.thoughtcrime.securesms.ui.base import org.thoughtcrime.securesms.ui.base
import org.thoughtcrime.securesms.ui.color.Colors import org.thoughtcrime.securesms.ui.color.Colors
import org.thoughtcrime.securesms.ui.color.LocalColors import org.thoughtcrime.securesms.ui.color.LocalColors
import org.thoughtcrime.securesms.ui.color.radioButtonColors
import org.thoughtcrime.securesms.ui.components.Button import org.thoughtcrime.securesms.ui.components.Button
import org.thoughtcrime.securesms.ui.components.ButtonType import org.thoughtcrime.securesms.ui.components.ButtonType
import org.thoughtcrime.securesms.ui.contentDescription import org.thoughtcrime.securesms.ui.contentDescription
@ -64,6 +75,8 @@ internal fun MessageNotificationsScreen(
R.string.activity_pn_mode_slow_mode_explanation, R.string.activity_pn_mode_slow_mode_explanation,
contentDescription = R.string.AccessibilityId_slow_mode_notifications_button, contentDescription = R.string.AccessibilityId_slow_mode_notifications_button,
selected = state.pushDisabled, selected = state.pushDisabled,
radioEnterTransition = slideInVertically { -it },
radioExitTransition = slideOutVertically { -it },
onClick = { setEnabled(false) } onClick = { setEnabled(false) }
) )
} }
@ -81,6 +94,8 @@ private fun NotificationRadioButton(
@StringRes tag: Int? = null, @StringRes tag: Int? = null,
@StringRes contentDescription: Int? = null, @StringRes contentDescription: Int? = null,
selected: Boolean = false, selected: Boolean = false,
radioEnterTransition: EnterTransition = slideInVertically { it },
radioExitTransition: ExitTransition = slideOutVertically { it },
onClick: () -> Unit = {} onClick: () -> Unit = {}
) { ) {
Row { Row {
@ -89,36 +104,77 @@ private fun NotificationRadioButton(
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.contentDescription(contentDescription), .contentDescription(contentDescription),
type = ButtonType.Outline(LocalColors.current.text), type = ButtonType.Outline(
border = BorderStroke( contentColor = LocalColors.current.text,
width = ButtonDefaults.OutlinedBorderSize, borderColor = LocalColors.current.borders
color = if (selected) LocalColors.current.primary else LocalColors.current.borders
), ),
shape = RoundedCornerShape(8.dp) shape = RoundedCornerShape(8.dp),
contentPadding = PaddingValues(start = 15.dp, end = 15.dp, top = 10.dp, bottom = 11.dp)
) { ) {
Column( Column {
verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.xxsItemSpacing)
) {
Text(stringResource(title), style = h8) Text(stringResource(title), style = h8)
Text(stringResource(explanation), style = small)
Text(stringResource(explanation), style = small, modifier = Modifier.padding(top = 7.dp))
tag?.let { tag?.let {
Text( Text(
stringResource(it), stringResource(it),
modifier = Modifier.padding(top = 6.dp),
color = LocalColors.current.primary, color = LocalColors.current.primary,
style = h9 style = h9
) )
} }
} }
} }
Spacer(modifier = Modifier.width(20.dp))
RadioButton( RadioButton(
selected = selected, selected = selected,
modifier = Modifier.align(Alignment.CenterVertically), modifier = Modifier
onClick = onClick, .size(22.dp)
colors = LocalColors.current.radioButtonColors() .align(Alignment.CenterVertically),
enter = radioEnterTransition,
exit = radioExitTransition,
onClick = onClick
) )
} }
} }
@Composable
private fun RadioButton(
selected: Boolean,
modifier: Modifier,
enter: EnterTransition = slideInVertically { it },
exit: ExitTransition = slideOutVertically { it },
onClick: () -> Unit
) {
IconButton(modifier = modifier, onClick = onClick) {
AnimatedVisibility(
selected,
modifier = Modifier.clip(CircleShape),
enter = enter,
exit = exit
) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(2.5.dp)
.background(
color = LocalColors.current.primary,
shape = CircleShape
)
)
}
Box(
modifier = Modifier
.aspectRatio(1f)
.border(
width = LocalDimensions.current.borderStroke,
color = LocalColors.current.text,
shape = CircleShape
)
) {}
}
}
@Preview @Preview
@Composable @Composable
private fun MessageNotificationsScreenPreview( private fun MessageNotificationsScreenPreview(

View File

@ -23,15 +23,18 @@ interface ButtonType {
@Composable @Composable
fun buttonColors(): ButtonColors fun buttonColors(): ButtonColors
class Outline(private val color: Color): ButtonType { class Outline(
private val contentColor: Color,
private val borderColor: Color = contentColor
): ButtonType {
@Composable @Composable
override fun border(enabled: Boolean) = BorderStroke( override fun border(enabled: Boolean) = BorderStroke(
width = LocalDimensions.current.borderStroke, width = LocalDimensions.current.borderStroke,
color = if (enabled) color else LocalColors.current.disabled color = if (enabled) borderColor else LocalColors.current.disabled
) )
@Composable @Composable
override fun buttonColors() = ButtonDefaults.buttonColors( override fun buttonColors() = ButtonDefaults.buttonColors(
contentColor = color, contentColor = contentColor,
backgroundColor = Color.Unspecified, backgroundColor = Color.Unspecified,
disabledContentColor = LocalColors.current.disabled, disabledContentColor = LocalColors.current.disabled,
disabledBackgroundColor = Color.Unspecified disabledBackgroundColor = Color.Unspecified