summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-10-02 09:22:00 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-10-03 08:52:02 +0200
commit8b0088394d1a05b7fcd021ccf52a435f1e341266 (patch)
treec375d30db2e7d01c620aefc9fc2b11c60ba7933f /android/app/src
parenta71099188b851fee82ecf1018c2c32e43c4e224a (diff)
downloadmullvadvpn-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.kt80
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)
- )
- )
-}