From fee32bed37b0ea31bcec1a19329be01606cc4714 Mon Sep 17 00:00:00 2001 From: sim Date: Tue, 23 Sep 2025 14:49:58 +0200 Subject: [PATCH] Add Privacy Policy Fix #62 --- .../sunup/activities/AppBarViewModel.kt | 6 ++ .../sunup/activities/ui/AppBarUi.kt | 18 ++++++ .../sunup/activities/ui/AppBarUiState.kt | 1 + .../activities/ui/PrivacyPolicyDialogUi.kt | 56 +++++++++++++++++++ app/src/main/res/values/strings.xml | 4 ++ 5 files changed, 85 insertions(+) create mode 100644 app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/PrivacyPolicyDialogUi.kt create mode 100644 app/src/main/res/values/strings.xml diff --git a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/AppBarViewModel.kt b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/AppBarViewModel.kt index 984dd6e..49a1c39 100644 --- a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/AppBarViewModel.kt +++ b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/AppBarViewModel.kt @@ -46,6 +46,12 @@ class AppBarViewModel( } } + fun togglePrivacyPolicy() { + viewModelScope.launch { + state = state.copy(showPrivacyPolicy = !state.showPrivacyPolicy) + } + } + fun newPushServer(url: String) { var url = url viewModelScope.launch { diff --git a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUi.kt b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUi.kt index 56a213c..dad6c0f 100644 --- a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUi.kt +++ b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUi.kt @@ -63,6 +63,9 @@ fun AppBarUi(appBarViewModel: AppBarViewModel) { onDismiss = { appBarViewModel.toggleMenu() }, + onShowPrivacyPolicy = { + appBarViewModel.togglePrivacyPolicy() + }, onChangeServer = { appBarViewModel.toggleChangeServer() }, @@ -89,6 +92,11 @@ fun AppBarUi(appBarViewModel: AppBarViewModel) { if (state.showMigrations) { DistribMigrationUi(appBarViewModel.migrationViewModel) } + if (state.showPrivacyPolicy) { + PrivacyPolicyDialog { + appBarViewModel.togglePrivacyPolicy() + } + } } @Composable @@ -96,6 +104,7 @@ fun Dropdown( expanded: Boolean, showToasts: Boolean, showMigrations: Boolean, + onShowPrivacyPolicy: () -> Unit, onRestart: () -> Unit, onDismiss: () -> Unit, onChangeServer: () -> Unit, @@ -107,6 +116,15 @@ fun Dropdown( expanded = expanded, onDismissRequest = onDismiss ) { + DropdownMenuItem( + onClick = { + onShowPrivacyPolicy() + onDismiss() + }, + text = { + Text(stringResource(LibR.string.privacy_policy)) + } + ) DropdownMenuItem( onClick = onRestart, text = { diff --git a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUiState.kt b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUiState.kt index 8e743df..453b331 100644 --- a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUiState.kt +++ b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/AppBarUiState.kt @@ -9,6 +9,7 @@ data class AppBarUiState( val currentApiUrl: String, val showToasts: Boolean, val menuExpanded: Boolean = false, + val showPrivacyPolicy: Boolean = false, val showChangeServerDialog: Boolean = false, /** * Used for the fallback service dialog and migration dialog diff --git a/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/PrivacyPolicyDialogUi.kt b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/PrivacyPolicyDialogUi.kt new file mode 100644 index 0000000..1176e95 --- /dev/null +++ b/app/src/main/java/org/unifiedpush/distributor/sunup/activities/ui/PrivacyPolicyDialogUi.kt @@ -0,0 +1,56 @@ +package org.unifiedpush.distributor.sunup.activities.ui + +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withLink +import androidx.compose.ui.tooling.preview.Preview +import org.unifiedpush.distributor.sunup.R +import org.unifiedpush.android.distributor.ui.R as LibR + +@Composable +fun PrivacyPolicyDialog(onDismiss: () -> Unit) { + AlertDialog( + title = { + Text(stringResource(LibR.string.privacy_policy)) + }, + text = { + PrivacyPolicy() + }, + onDismissRequest = onDismiss, + confirmButton = { + TextButton( + onClick = onDismiss + ) { + Text(stringResource(android.R.string.cancel)) + } + } + + ) +} + +@Preview +@Composable +private fun PrivacyPolicy() { + Text( + buildAnnotatedString { + append(stringResource(R.string.sunup_privacy_policy).format(stringResource(R.string.app_name))) + + withLink( + LinkAnnotation.Url( + "https://www.mozilla.org/en-US/privacy/firefox/#types-of-data-defined", + TextLinkStyles(style = SpanStyle(color = MaterialTheme.colorScheme.primary)) + ) + ) { + append("https://www.mozilla.org/en-US/privacy/firefox/") + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f13a3e3 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + By default, %s uses Mozilla push server which therefor has access to the origin IP address of the requests (from your phone).\n\nDuring the first connection, the app generates a unique ID shared with the server to identify itself and to be linked to generated push endpoints. This ID is kept across reconnections, to receive notifications while the device is offline.\n\nThe push server keeps a record of the last connection date, to be able to remove unused ID.\n\nMozilla servers are located in the USA.\n\nFor more information, see Mozilla Firefox privacy policy - technical data.\n\n + \ No newline at end of file