Align pnp privacy settings screens with figma.

This commit is contained in:
Alex Hart 2024-01-16 14:10:29 -04:00 committed by Greyson Parrelli
parent ddcc06c6b7
commit dd527ce33c
4 changed files with 52 additions and 15 deletions

View file

@ -6,6 +6,9 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -17,7 +20,9 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import kotlinx.coroutines.launch
import org.signal.core.ui.Dividers import org.signal.core.ui.Dividers
import org.signal.core.ui.Rows import org.signal.core.ui.Rows
import org.signal.core.ui.Scaffolds import org.signal.core.ui.Scaffolds
@ -48,11 +53,16 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
{ findNavController().popBackStack() } { findNavController().popBackStack() }
} }
val snackbarHostState = remember { SnackbarHostState() }
Scaffolds.Settings( Scaffolds.Settings(
title = stringResource(id = R.string.preferences_app_protection__phone_number), title = stringResource(id = R.string.preferences_app_protection__phone_number),
onNavigationClick = onNavigationClick, onNavigationClick = onNavigationClick,
navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24),
navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close), navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close),
snackbarHost = {
SnackbarHost(snackbarHostState)
},
modifier = Modifier.nestedScroll(statusBarNestedScrollConnection) modifier = Modifier.nestedScroll(statusBarNestedScrollConnection)
) { contentPadding -> ) { contentPadding ->
Box(modifier = Modifier.padding(contentPadding)) { Box(modifier = Modifier.padding(contentPadding)) {
@ -85,7 +95,7 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
id = if (state.phoneNumberSharing) { id = if (state.phoneNumberSharing) {
R.string.PhoneNumberPrivacySettingsFragment__your_phone_number R.string.PhoneNumberPrivacySettingsFragment__your_phone_number
} else { } else {
R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see_your
} }
), ),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
@ -110,23 +120,38 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
) )
} }
if (!state.phoneNumberSharing) { item {
item { val snackbarMessage = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__to_change_this_setting)
Rows.RadioRow( val onClick: () -> Unit = remember(state.phoneNumberSharing) {
selected = !state.discoverableByPhoneNumber, if (!state.phoneNumberSharing) {
text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), { viewModel.setNobodyCanFindMeByMyNumber() }
modifier = Modifier.clickable(onClick = viewModel::setNobodyCanFindMeByMyNumber) } else {
) {
lifecycleScope.launch {
snackbarHostState.showSnackbar(
message = snackbarMessage,
duration = SnackbarDuration.Short
)
}
}
}
} }
Rows.RadioRow(
enabled = !state.phoneNumberSharing,
selected = !state.discoverableByPhoneNumber,
text = stringResource(id = R.string.PhoneNumberPrivacy_nobody),
modifier = Modifier.clickable(onClick = onClick)
)
} }
item { item {
Text( Text(
text = stringResource( text = stringResource(
id = if (state.discoverableByPhoneNumber) { id = if (state.discoverableByPhoneNumber) {
R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has R.string.PhoneNumberPrivacySettingsFragment__anyone_who_has
} else { } else {
R.string.WhoCanSeeMyPhoneNumberFragment__nobody_on_signal R.string.PhoneNumberPrivacySettingsFragment__nobody_will_be_able_to_see
} }
), ),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,

View file

@ -3767,11 +3767,17 @@
<!-- Section title above two radio buttons for enabling and disabling phone number display --> <!-- Section title above two radio buttons for enabling and disabling phone number display -->
<string name="PhoneNumberPrivacySettingsFragment__who_can_see_my_number">Who can see my number</string> <string name="PhoneNumberPrivacySettingsFragment__who_can_see_my_number">Who can see my number</string>
<!-- Subtext below radio buttons when who can see my number is set to nobody --> <!-- Subtext below radio buttons when who can see my number is set to nobody -->
<string name="PhoneNumberPrivacySettingsFragment__nobody_will_see">Nobody will see your phone number on Signal</string> <string name="PhoneNumberPrivacySettingsFragment__nobody_will_see_your">Nobody will see your phone number on Signal, even when messaging them.</string>
<!-- Section title above two radio buttons for enabling and disabling whether users can find me by my phone number --> <!-- Section title above two radio buttons for enabling and disabling whether users can find me by my phone number -->
<string name="PhoneNumberPrivacySettingsFragment__who_can_find_me_by_number">Who can find me by number</string> <string name="PhoneNumberPrivacySettingsFragment__who_can_find_me_by_number">Who can find me by number</string>
<!-- Subtext below radio buttons when who can see my number is set to everyone --> <!-- Subtext below radio buttons when who can see my number is set to everyone -->
<string name="PhoneNumberPrivacySettingsFragment__your_phone_number">Your phone number will be visible to people and groups you message. People who have your number in their phone contacts will also see it on Signal.</string> <string name="PhoneNumberPrivacySettingsFragment__your_phone_number">Your phone number will be visible to people and groups you message. People who have your number in their phone contacts will also see it on Signal.</string>
<!-- Subtext below radio buttons when who can find me by number is set to everyone -->
<string name="PhoneNumberPrivacySettingsFragment__anyone_who_has">Anyone who has your phone number will see you\'re on Signal and can start chats with you.</string>
<!-- Subtext below radio buttons when who can find me by number is set to nobody -->
<string name="PhoneNumberPrivacySettingsFragment__nobody_will_be_able_to_see">Nobody will be able to see you\'re on Signal unless you message them or have an existing chat with them.</string>
<!-- Snackbar text when pressing invalid radio item -->
<string name="PhoneNumberPrivacySettingsFragment__to_change_this_setting">To change this setting, set "Who can see my number" to "Nobody".</string>
<string name="PhoneNumberPrivacy_everyone">Everyone</string> <string name="PhoneNumberPrivacy_everyone">Everyone</string>
<string name="PhoneNumberPrivacy_nobody">Nobody</string> <string name="PhoneNumberPrivacy_nobody">Nobody</string>
<string name="preferences_app_protection__screen_lock">Screen lock</string> <string name="preferences_app_protection__screen_lock">Screen lock</string>

View file

@ -18,9 +18,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
@ -40,21 +40,25 @@ object Rows {
selected: Boolean, selected: Boolean,
text: String, text: String,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
label: String? = null label: String? = null,
enabled: Boolean = true
) { ) {
Row( Row(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding(defaultPadding()), .padding(defaultPadding()),
verticalAlignment = Alignment.CenterVertically verticalAlignment = CenterVertically
) { ) {
RadioButton( RadioButton(
enabled = enabled,
selected = selected, selected = selected,
onClick = null, onClick = null,
modifier = Modifier.padding(end = 24.dp) modifier = Modifier.padding(end = 24.dp)
) )
Column { Column(
modifier = Modifier.alpha(if (enabled) 1f else 0.4f)
) {
Text( Text(
text = text, text = text,
style = MaterialTheme.typography.bodyLarge style = MaterialTheme.typography.bodyLarge

View file

@ -38,11 +38,13 @@ object Scaffolds {
titleContent: @Composable (Float, String) -> Unit = { _, title -> titleContent: @Composable (Float, String) -> Unit = { _, title ->
Text(text = title, style = MaterialTheme.typography.titleLarge) Text(text = title, style = MaterialTheme.typography.titleLarge)
}, },
snackbarHost: @Composable () -> Unit = {},
content: @Composable (PaddingValues) -> Unit content: @Composable (PaddingValues) -> Unit
) { ) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
Scaffold( Scaffold(
snackbarHost = snackbarHost,
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { title = {