diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt index d50f761993..e519242972 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.components.settings.app.privacy.pnp +import android.content.res.Configuration import android.os.Bundle import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -18,6 +19,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -27,6 +29,7 @@ import org.signal.core.ui.Dividers import org.signal.core.ui.Rows import org.signal.core.ui.Scaffolds import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection @@ -49,118 +52,179 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { @Composable override fun FragmentContent() { val state: PhoneNumberPrivacySettingsState by viewModel.state - val onNavigationClick: () -> Unit = remember { - { findNavController().popBackStack() } - } - val snackbarHostState = remember { SnackbarHostState() } + val snackbarMessage = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__to_change_this_setting) - Scaffolds.Settings( - title = stringResource(id = R.string.preferences_app_protection__phone_number), - onNavigationClick = onNavigationClick, - navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), - navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close), - snackbarHost = { - SnackbarHost(snackbarHostState) - }, - modifier = Modifier.nestedScroll(statusBarNestedScrollConnection) - ) { contentPadding -> - Box(modifier = Modifier.padding(contentPadding)) { - LazyColumn { - item { - Texts.SectionHeader( - text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__who_can_see_my_number) + Screen( + state = state, + snackbarHostState = snackbarHostState, + onNavigationClick = { findNavController().popBackStack() }, + statusBarNestedScrollConnection = statusBarNestedScrollConnection, + onEveryoneCanSeeMyNumberClicked = viewModel::setEveryoneCanSeeMyNumber, + onNobodyCanSeeMyNumberClicked = viewModel::setNobodyCanSeeMyNumber, + onEveryoneCanFindMeByNumberClicked = viewModel::setEveryoneCanFindMeByMyNumber, + onNobodyCanFindMeByNumberClicked = { + if (!state.phoneNumberSharing) { + viewModel.setNobodyCanFindMeByMyNumber() + } else { + lifecycleScope.launch { + snackbarHostState.showSnackbar( + message = snackbarMessage, + duration = SnackbarDuration.Short ) } + } + } + ) + } +} - item { - Rows.RadioRow( - selected = state.phoneNumberSharing, - text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), - modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanSeeMyNumber) - ) - } +@Composable +private fun Screen( + state: PhoneNumberPrivacySettingsState, + snackbarHostState: SnackbarHostState = SnackbarHostState(), + onNavigationClick: () -> Unit = {}, + statusBarNestedScrollConnection: StatusBarColorNestedScrollConnection? = null, + onEveryoneCanSeeMyNumberClicked: () -> Unit = {}, + onNobodyCanSeeMyNumberClicked: () -> Unit = {}, + onEveryoneCanFindMeByNumberClicked: () -> Unit = {}, + onNobodyCanFindMeByNumberClicked: () -> Unit = {} +) { + Scaffolds.Settings( + title = stringResource(id = R.string.preferences_app_protection__phone_number), + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), + navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close), + snackbarHost = { + SnackbarHost(snackbarHostState) + }, + modifier = statusBarNestedScrollConnection?.let { Modifier.nestedScroll(it) } ?: Modifier + ) { contentPadding -> + Box(modifier = Modifier.padding(contentPadding)) { + LazyColumn { + item { + Texts.SectionHeader( + text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment_who_can_see_my_number_heading) + ) + } - item { - Rows.RadioRow( - selected = !state.phoneNumberSharing, - text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), - modifier = Modifier.clickable(onClick = viewModel::setNobodyCanSeeMyNumber) - ) - } + item { + Rows.RadioRow( + selected = state.phoneNumberSharing, + text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), + modifier = Modifier.clickable(onClick = onEveryoneCanSeeMyNumberClicked) + ) + } - item { - Text( - text = stringResource( - id = if (state.phoneNumberSharing) { - R.string.PhoneNumberPrivacySettingsFragment__your_phone_number_will_be - } else { - R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see_your - } - ), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) - ) - } + item { + Rows.RadioRow( + selected = !state.phoneNumberSharing, + text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), + modifier = Modifier.clickable(onClick = onNobodyCanSeeMyNumberClicked) + ) + } - item { - Dividers.Default() - } - - item { - Texts.SectionHeader(text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__who_can_find_me_by_number)) - } - - item { - Rows.RadioRow( - selected = state.discoverableByPhoneNumber, - text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), - modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanFindMeByMyNumber) - ) - } - - item { - val snackbarMessage = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__to_change_this_setting) - val onClick: () -> Unit = remember(state.phoneNumberSharing) { - if (!state.phoneNumberSharing) { - { viewModel.setNobodyCanFindMeByMyNumber() } + item { + Text( + text = stringResource( + id = if (state.phoneNumberSharing) { + R.string.PhoneNumberPrivacySettingsFragment_sharing_on_description } else { - { - lifecycleScope.launch { - snackbarHostState.showSnackbar( - message = snackbarMessage, - duration = SnackbarDuration.Short - ) - } + if (state.discoverableByPhoneNumber) { + R.string.PhoneNumberPrivacySettingsFragment_sharing_off_discovery_on_description + } else { + R.string.PhoneNumberPrivacySettingsFragment_sharing_off_discovery_off_description } } - } + ), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) + ) + } - Rows.RadioRow( - enabled = !state.phoneNumberSharing, - selected = !state.discoverableByPhoneNumber, - text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), - modifier = Modifier.clickable(onClick = onClick) - ) - } + item { + Dividers.Default() + } - item { - Text( - text = stringResource( - id = if (state.discoverableByPhoneNumber) { - R.string.PhoneNumberPrivacySettingsFragment__anyone_who_has - } else { - R.string.PhoneNumberPrivacySettingsFragment__nobody_will_be_able_to_see - } - ), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) - ) - } + item { + Texts.SectionHeader(text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment_who_can_find_me_by_number_heading)) + } + + item { + Rows.RadioRow( + selected = state.discoverableByPhoneNumber, + text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), + modifier = Modifier.clickable(onClick = onEveryoneCanFindMeByNumberClicked) + ) + } + + item { + Rows.RadioRow( + enabled = !state.phoneNumberSharing, + selected = !state.discoverableByPhoneNumber, + text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), + modifier = Modifier.clickable(onClick = onNobodyCanFindMeByNumberClicked) + ) + } + + item { + Text( + text = stringResource( + id = if (state.discoverableByPhoneNumber) { + R.string.PhoneNumberPrivacySettingsFragment_discovery_on_description + } else { + R.string.PhoneNumberPrivacySettingsFragment_discovery_off_description + } + ), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) + ) } } } } } + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewSharingAndDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = true, + discoverableByPhoneNumber = true + ) + ) + } +} + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewNotSharingDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = false, + discoverableByPhoneNumber = true + ) + ) + } +} + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewNotSharingNotDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = false, + discoverableByPhoneNumber = false + ) + ) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 010109af60..4a344423fe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3799,17 +3799,19 @@ Choose who can see your phone number and who can contact you on Signal with it. - Who can see my number - - Nobody will see your phone number on Signal, even when messaging them. + Who can see my number + + Your phone number will be visible to people and groups you message. + + Your phone number will not be visible to anyone unless they have it saved in their phone\'s contacts. + + Your phone number will not be visible to anyone. - Who can find me by number - - Your phone number will be visible to people and groups you message. + Who can find me by number - Anyone who has your phone number will see you\'re on Signal and can start chats with you. + Anyone who has your phone number will see you\'re on Signal and can start chats with you. - Nobody will be able to see you\'re on Signal unless you message them or have an existing chat with them. + Nobody will be able to see you\'re on Signal unless you message them or have an existing chat with them. To change this setting, set "Who can see my number" to "Nobody". Everyone