diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-10-28 16:18:48 +0100 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-10-29 13:04:02 +0100 |
| commit | 7620b58cd9384fc8de98eeb9e47363eff683ca51 (patch) | |
| tree | 53038073e333c3aa305d776b7068cd25ae9c84c4 /android/app | |
| parent | ee85ee6bda35d5c55110d5372ccce39e29098772 (diff) | |
| download | mullvadvpn-7620b58cd9384fc8de98eeb9e47363eff683ca51.tar.xz mullvadvpn-7620b58cd9384fc8de98eeb9e47363eff683ca51.zip | |
Add info dialog
Diffstat (limited to 'android/app')
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, |
