summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-10-28 16:18:48 +0100
committerDavid Göransson <david.goransson@mullvad.net>2024-10-29 13:04:02 +0100
commit7620b58cd9384fc8de98eeb9e47363eff683ca51 (patch)
tree53038073e333c3aa305d776b7068cd25ae9c84c4 /android/app
parentee85ee6bda35d5c55110d5372ccce39e29098772 (diff)
downloadmullvadvpn-7620b58cd9384fc8de98eeb9e47363eff683ca51.tar.xz
mullvadvpn-7620b58cd9384fc8de98eeb9e47363eff683ca51.zip
Add info dialog
Diffstat (limited to 'android/app')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/EncryptedDnsProxyInfoDialog.kt32
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ApiAccessMethodDetailsUiStatePreviewParameterProvider.kt32
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt15
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ApiAccessMethodDetailsUiState.kt18
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt8
5 files changed, 85 insertions, 20 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/EncryptedDnsProxyInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/EncryptedDnsProxyInfoDialog.kt
new file mode 100644
index 0000000000..366266aa58
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/EncryptedDnsProxyInfoDialog.kt
@@ -0,0 +1,32 @@
+package net.mullvad.mullvadvpn.compose.dialog.info
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+import com.ramcosta.composedestinations.annotation.Destination
+import com.ramcosta.composedestinations.annotation.RootGraph
+import com.ramcosta.composedestinations.navigation.DestinationsNavigator
+import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
+import com.ramcosta.composedestinations.spec.DestinationStyle
+import net.mullvad.mullvadvpn.R
+import net.mullvad.mullvadvpn.compose.component.textResource
+import net.mullvad.mullvadvpn.lib.theme.AppTheme
+
+@Preview
+@Composable
+private fun PreviewEncryptedDnsProxyInfo() {
+ AppTheme { EncryptedDnsProxyInfo(EmptyDestinationsNavigator) }
+}
+
+@Destination<RootGraph>(style = DestinationStyle.Dialog::class)
+@Composable
+fun EncryptedDnsProxyInfo(navigator: DestinationsNavigator) {
+ InfoDialog(
+ message =
+ buildString {
+ appendLine(textResource(id = R.string.encrypted_dns_proxy_info_message_part1))
+ appendLine()
+ appendLine(textResource(id = R.string.encrypted_dns_proxy_info_message_part2))
+ },
+ onDismiss = navigator::navigateUp,
+ )
+}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ApiAccessMethodDetailsUiStatePreviewParameterProvider.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ApiAccessMethodDetailsUiStatePreviewParameterProvider.kt
index 2df28e5aa8..a2750e1810 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ApiAccessMethodDetailsUiStatePreviewParameterProvider.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ApiAccessMethodDetailsUiStatePreviewParameterProvider.kt
@@ -2,6 +2,10 @@ package net.mullvad.mullvadvpn.compose.preview
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodDetailsUiState
+import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod
+import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodSetting
+import net.mullvad.mullvadvpn.lib.model.Cipher
+import net.mullvad.mullvadvpn.lib.model.Port
class ApiAccessMethodDetailsUiStatePreviewParameterProvider :
PreviewParameterProvider<ApiAccessMethodDetailsUiState> {
@@ -11,10 +15,13 @@ class ApiAccessMethodDetailsUiStatePreviewParameterProvider :
// Non-editable api access type
defaultAccessMethods[0].let {
ApiAccessMethodDetailsUiState.Content(
- apiAccessMethodId = it.id,
- name = it.name,
- enabled = it.enabled,
- isEditable = false,
+ apiAccessMethodSetting =
+ ApiAccessMethodSetting(
+ id = it.id,
+ name = it.name,
+ enabled = it.enabled,
+ apiAccessMethod = ApiAccessMethod.Direct,
+ ),
isCurrentMethod = false,
isDisableable = true,
isTestingAccessMethod = false,
@@ -23,10 +30,19 @@ class ApiAccessMethodDetailsUiStatePreviewParameterProvider :
// Editable api access type, current method, can not be disabled
shadowsocks.let {
ApiAccessMethodDetailsUiState.Content(
- apiAccessMethodId = it.id,
- name = it.name,
- enabled = it.enabled,
- isEditable = true,
+ apiAccessMethodSetting =
+ ApiAccessMethodSetting(
+ id = it.id,
+ name = it.name,
+ enabled = it.enabled,
+ apiAccessMethod =
+ ApiAccessMethod.CustomProxy.Shadowsocks(
+ "123.123.123.123",
+ Port.fromString("1234").getOrNull()!!,
+ null,
+ Cipher.CHACHA20_IETF_POLY1305,
+ ),
+ ),
isCurrentMethod = true,
isDisableable = false,
isTestingAccessMethod = false,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt
index 68cd3dd00b..35c4c8a444 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt
@@ -33,10 +33,12 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.DeleteApiAccessMethodConfirmationDestination
import com.ramcosta.composedestinations.generated.destinations.EditApiAccessMethodDestination
+import com.ramcosta.composedestinations.generated.destinations.EncryptedDnsProxyInfoDestination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.ResultRecipient
import kotlinx.coroutines.launch
@@ -60,6 +62,7 @@ import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
import net.mullvad.mullvadvpn.compose.util.OnNavResultValue
import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
+import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod
import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodId
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.lib.theme.Dimens
@@ -175,6 +178,8 @@ fun ApiAccessMethodDetails(
launchSingleTop = true
}
},
+ onNavigateToEncryptedDnsInfoDialog =
+ dropUnlessResumed { navigator.navigate(EncryptedDnsProxyInfoDestination) },
onBackClicked = navigator::navigateUp,
)
}
@@ -188,6 +193,7 @@ fun ApiAccessMethodDetailsScreen(
onTestMethodClicked: () -> Unit = {},
onUseMethodClicked: () -> Unit = {},
onDeleteApiAccessMethodClicked: (ApiAccessMethodId) -> Unit = {},
+ onNavigateToEncryptedDnsInfoDialog: () -> Unit = {},
onBackClicked: () -> Unit = {},
) {
ScaffoldWithMediumTopBar(
@@ -214,6 +220,7 @@ fun ApiAccessMethodDetailsScreen(
onEnableClicked = onEnableClicked,
onTestMethodClicked = onTestMethodClicked,
onUseMethodClicked = onUseMethodClicked,
+ onNavigateToEncryptedDnsInfoDialog = onNavigateToEncryptedDnsInfoDialog,
)
}
}
@@ -232,6 +239,7 @@ private fun Content(
onEnableClicked: (Boolean) -> Unit,
onTestMethodClicked: () -> Unit,
onUseMethodClicked: () -> Unit,
+ onNavigateToEncryptedDnsInfoDialog: () -> Unit,
) {
if (state.isEditable) {
NavigationComposeCell(
@@ -246,6 +254,13 @@ private fun Content(
title = stringResource(id = R.string.enable_method),
isToggled = state.enabled,
onCellClicked = onEnableClicked,
+ onInfoClicked =
+ when (state.apiAccessMethod) {
+ ApiAccessMethod.EncryptedDns -> onNavigateToEncryptedDnsInfoDialog
+ ApiAccessMethod.Bridges,
+ is ApiAccessMethod.CustomProxy,
+ ApiAccessMethod.Direct -> null
+ },
)
if (!state.isDisableable) {
SwitchComposeSubtitleCell(
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ApiAccessMethodDetailsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ApiAccessMethodDetailsUiState.kt
index d91bf850d0..9229cb9459 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ApiAccessMethodDetailsUiState.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/ApiAccessMethodDetailsUiState.kt
@@ -1,7 +1,9 @@
package net.mullvad.mullvadvpn.compose.state
+import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod
import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodId
import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodName
+import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodSetting
sealed interface ApiAccessMethodDetailsUiState {
val apiAccessMethodId: ApiAccessMethodId
@@ -10,18 +12,22 @@ sealed interface ApiAccessMethodDetailsUiState {
ApiAccessMethodDetailsUiState
data class Content(
- override val apiAccessMethodId: ApiAccessMethodId,
- val name: ApiAccessMethodName,
- val enabled: Boolean,
- val isEditable: Boolean,
+ val apiAccessMethodSetting: ApiAccessMethodSetting,
val isDisableable: Boolean,
val isCurrentMethod: Boolean,
val isTestingAccessMethod: Boolean,
- ) : ApiAccessMethodDetailsUiState
+ ) : ApiAccessMethodDetailsUiState {
+ override val apiAccessMethodId: ApiAccessMethodId = apiAccessMethodSetting.id
+ val isEditable: Boolean =
+ apiAccessMethodSetting.apiAccessMethod is ApiAccessMethod.CustomProxy
+ val name: ApiAccessMethodName = apiAccessMethodSetting.name
+ val enabled: Boolean = apiAccessMethodSetting.enabled
+ val apiAccessMethod: ApiAccessMethod = apiAccessMethodSetting.apiAccessMethod
+ }
fun name() = (this as? Content)?.name?.value ?: ""
- fun canBeEdited() = this is Content && isEditable
+ fun canBeEdited() = this is Content && apiAccessMethod is ApiAccessMethod.CustomProxy
fun testingAccessMethod() = this is Content && isTestingAccessMethod
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt
index 6d3dd5ccdb..1e617817af 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt
@@ -17,7 +17,6 @@ import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodDetailsUiState
import net.mullvad.mullvadvpn.constant.MINIMUM_LOADING_TIME_MILLIS
-import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod
import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodId
import net.mullvad.mullvadvpn.lib.model.TestApiAccessMethodError
import net.mullvad.mullvadvpn.repository.ApiAccessRepository
@@ -42,15 +41,12 @@ class ApiAccessMethodDetailsViewModel(
apiAccessRepository.currentAccessMethod,
isTestingApiAccessMethodState,
) {
- apiAccessMethod,
+ apiAccessMethodSetting,
enabledApiAccessMethods,
currentAccessMethod,
isTestingApiAccessMethod ->
ApiAccessMethodDetailsUiState.Content(
- apiAccessMethodId = apiAccessMethodId,
- name = apiAccessMethod.name,
- enabled = apiAccessMethod.enabled,
- isEditable = apiAccessMethod.apiAccessMethod is ApiAccessMethod.CustomProxy,
+ apiAccessMethodSetting = apiAccessMethodSetting,
isDisableable = enabledApiAccessMethods.any { it.id != apiAccessMethodId },
isCurrentMethod = currentAccessMethod?.id == apiAccessMethodId,
isTestingAccessMethod = isTestingApiAccessMethod,