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