diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-10-02 09:22:00 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-10-03 08:52:02 +0200 |
| commit | 8b0088394d1a05b7fcd021ccf52a435f1e341266 (patch) | |
| tree | c375d30db2e7d01c620aefc9fc2b11c60ba7933f /android/app/src | |
| parent | a71099188b851fee82ecf1018c2c32e43c4e224a (diff) | |
| download | mullvadvpn-8b0088394d1a05b7fcd021ccf52a435f1e341266.tar.xz mullvadvpn-8b0088394d1a05b7fcd021ccf52a435f1e341266.zip | |
Use LinkAnnotation for PrivacyDisclaimer
Diffstat (limited to 'android/app/src')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt | 80 |
1 files changed, 36 insertions, 44 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt index f894eb8eba..69bc87ce9f 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt @@ -1,7 +1,5 @@ package net.mullvad.mullvadvpn.compose.screen -import android.content.Context -import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -11,9 +9,8 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.OpenInNew @@ -27,10 +24,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withLink +import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -52,7 +52,6 @@ import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.compose.util.toDp import net.mullvad.mullvadvpn.constant.DAEMON_READY_TIMEOUT_MS -import net.mullvad.mullvadvpn.lib.common.util.openLink import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.lib.theme.color.AlphaScrollbar @@ -70,7 +69,6 @@ private fun PreviewPrivacyDisclaimerScreen() { PrivacyDisclaimerScreen( PrivacyDisclaimerViewState(isStartingService = false, isPlayBuild = false), {}, - {}, ) } } @@ -108,19 +106,11 @@ fun PrivacyDisclaimer(navigator: DestinationsNavigator) { } } } - PrivacyDisclaimerScreen( - state, - { openPrivacyPolicy(context, state.isPlayBuild) }, - viewModel::setPrivacyDisclosureAccepted, - ) + PrivacyDisclaimerScreen(state, viewModel::setPrivacyDisclosureAccepted) } @Composable -fun PrivacyDisclaimerScreen( - state: PrivacyDisclaimerViewState, - onPrivacyPolicyLinkClicked: () -> Unit, - onAcceptClicked: () -> Unit, -) { +fun PrivacyDisclaimerScreen(state: PrivacyDisclaimerViewState, onAcceptClicked: () -> Unit) { val topColor = MaterialTheme.colorScheme.primary ScaffoldWithTopBar(topBarColor = topColor, onAccountClicked = null, onSettingsClicked = null) { val scrollState = rememberScrollState() @@ -136,7 +126,7 @@ fun PrivacyDisclaimerScreen( ), verticalArrangement = Arrangement.SpaceBetween, ) { - Content(onPrivacyPolicyLinkClicked) + Content(state.isPlayBuild) ButtonPanel(state.isStartingService, onAcceptClicked) } @@ -144,7 +134,7 @@ fun PrivacyDisclaimerScreen( } @Composable -private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { +private fun Content(isPlayBuild: Boolean) { Column { Text( text = stringResource(id = R.string.privacy_disclaimer_title), @@ -169,26 +159,19 @@ private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { color = MaterialTheme.colorScheme.onSurface, ) - Row(modifier = Modifier.padding(top = 10.dp)) { - ClickableText( - text = AnnotatedString(stringResource(id = R.string.privacy_policy_label)), - onClick = { onPrivacyPolicyLinkClicked() }, - style = - TextStyle( - fontSize = 12.sp, - color = MaterialTheme.colorScheme.onSurface, - textDecoration = TextDecoration.Underline, - ), + Spacer(modifier = Modifier.height(fontSize.toDp() + Dimens.smallPadding)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = buildPrivacyPolicyAnnotatedString(isPlayBuild), + modifier = Modifier.padding(end = Dimens.miniPadding), ) Icon( imageVector = Icons.AutoMirrored.Filled.OpenInNew, contentDescription = null, modifier = - Modifier.align(Alignment.CenterVertically) - .padding(start = 2.dp, top = 2.dp) - .width(10.dp) - .height(10.dp), + Modifier.align(Alignment.CenterVertically).size(Dimens.privacyPolicyIconSize), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -196,6 +179,25 @@ private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { } @Composable +private fun buildPrivacyPolicyAnnotatedString(isPlayBuild: Boolean) = buildAnnotatedString { + withLink( + LinkAnnotation.Url( + stringResource(R.string.privacy_policy_url).appendHideNavOnPlayBuild(isPlayBuild) + ) + ) { + withStyle( + style = + SpanStyle( + color = MaterialTheme.colorScheme.onSurface, + textDecoration = TextDecoration.Underline, + ) + ) { + append(stringResource(id = R.string.privacy_policy_label)) + } + } +} + +@Composable private fun ButtonPanel(isStartingService: Boolean, onAcceptClicked: () -> Unit) { Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { if (isStartingService) { @@ -208,13 +210,3 @@ private fun ButtonPanel(isStartingService: Boolean, onAcceptClicked: () -> Unit) } } } - -private fun openPrivacyPolicy(context: Context, isPlayBuild: Boolean) { - context.openLink( - Uri.parse( - context.resources - .getString(R.string.privacy_policy_url) - .appendHideNavOnPlayBuild(isPlayBuild) - ) - ) -} |
