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