Skip to content

Commit d5e0ad0

Browse files
committed
Add dns settings screen
1 parent 8ccdcaf commit d5e0ad0

43 files changed

Lines changed: 1541 additions & 961 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

android/app/build.gradle.kts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,13 @@ dependencies {
397397
implementation(projects.lib.feature.applisting.api)
398398
implementation(projects.lib.feature.appearance.impl)
399399
implementation(projects.lib.feature.autoconnect.impl)
400-
implementation(projects.lib.feature.customlist.impl)
401400
implementation(projects.lib.feature.customlist.api)
401+
implementation(projects.lib.feature.customlist.impl)
402+
implementation(projects.lib.feature.daita.api)
402403
implementation(projects.lib.feature.daita.impl)
403404
implementation(projects.lib.feature.deleteaccount.impl)
404-
implementation(projects.lib.feature.daita.api)
405+
implementation(projects.lib.feature.dns.impl)
406+
implementation(projects.lib.feature.dns.api)
405407
implementation(projects.lib.feature.filter.impl)
406408
implementation(projects.lib.feature.home.impl)
407409
implementation(projects.lib.feature.home.api)

android/app/src/main/kotlin/net/mullvad/mullvadvpn/app/MullvadApp.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import net.mullvad.mullvadvpn.feature.autoconnect.impl.navigation.autoConnectEnt
5555
import net.mullvad.mullvadvpn.feature.customlist.impl.navigation.customListEntry
5656
import net.mullvad.mullvadvpn.feature.daita.impl.navigation.daitaEntry
5757
import net.mullvad.mullvadvpn.feature.deleteaccount.impl.navigation.deleteAccountEntry
58+
import net.mullvad.mullvadvpn.feature.dns.impl.navigation.dnsSettingsEntry
5859
import net.mullvad.mullvadvpn.feature.filter.impl.navigation.filterEntry
5960
import net.mullvad.mullvadvpn.feature.home.impl.navigation.homeEntry
6061
import net.mullvad.mullvadvpn.feature.language.impl.navigation.languageEntry
@@ -152,6 +153,7 @@ fun MullvadApp(serviceConnectionManager: ServiceConnectionManager) {
152153
splashEntry(nav3)
153154
splitTunnelingEntry(nav3)
154155
vpnSettingsEntry(nav3)
156+
dnsSettingsEntry(nav3)
155157
}
156158

157159
SharedTransitionLayout {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import net.mullvad.mullvadvpn.feature.customlist.impl.screen.editname.EditCustom
3333
import net.mullvad.mullvadvpn.feature.customlist.impl.screen.lists.CustomListsViewModel
3434
import net.mullvad.mullvadvpn.feature.daita.impl.DaitaViewModel
3535
import net.mullvad.mullvadvpn.feature.deleteaccount.impl.deleteaccountconfirmation.DeleteAccountConfirmationViewModel
36+
import net.mullvad.mullvadvpn.feature.dns.impl.CustomDnsDialogViewModel
37+
import net.mullvad.mullvadvpn.feature.dns.impl.DnsSettingsViewModel
3638
import net.mullvad.mullvadvpn.feature.filter.impl.FilterViewModel
3739
import net.mullvad.mullvadvpn.feature.home.impl.connect.ConnectViewModel
3840
import net.mullvad.mullvadvpn.feature.home.impl.connect.notificationbanner.InAppNotificationController
@@ -63,7 +65,6 @@ import net.mullvad.mullvadvpn.feature.splittunneling.impl.applist.ApplicationsPr
6365
import net.mullvad.mullvadvpn.feature.splittunneling.impl.applist.SplitTunnelingUseCase
6466
import net.mullvad.mullvadvpn.feature.splittunneling.impl.search.SearchSplitTunnelingViewModel
6567
import net.mullvad.mullvadvpn.feature.vpnsettings.impl.VpnSettingsViewModel
66-
import net.mullvad.mullvadvpn.feature.vpnsettings.impl.dns.DnsDialogViewModel
6768
import net.mullvad.mullvadvpn.feature.vpnsettings.impl.mtu.MtuDialogViewModel
6869
import net.mullvad.mullvadvpn.lib.common.constant.BillingTypes
6970
import net.mullvad.mullvadvpn.lib.model.PackageName
@@ -303,7 +304,7 @@ val uiModule = module {
303304
}
304305
viewModel { DeviceRevokedViewModel(get(), get(), get(), get()) }
305306
viewModel { params -> MtuDialogViewModel(navArgs = params.get(), get()) }
306-
viewModel { params -> DnsDialogViewModel(navArgs = params.get(), get(), get(), get()) }
307+
viewModel { params -> CustomDnsDialogViewModel(navArgs = params.get(), get(), get(), get()) }
307308
viewModel { params -> CustomPortDialogViewModel(navArgs = params.get()) }
308309
viewModel { LoginViewModel(get(), get(), get(), get(), get()) }
309310
viewModel { PrivacyDisclaimerViewModel(get(), IS_PLAY_BUILD) }
@@ -430,8 +431,14 @@ val uiModule = module {
430431
viewModel { params ->
431432
SplitTunnelingViewModel(isModal = params.get(), get(), get(), get(), Dispatchers.IO)
432433
}
433-
434434
viewModel { SearchSplitTunnelingViewModel(get(), get(), Dispatchers.IO) }
435+
viewModel { params ->
436+
DnsSettingsViewModel(
437+
isModal = params.get(),
438+
settingsRepository = get(),
439+
dispatcher = Dispatchers.IO,
440+
)
441+
}
435442

436443
// This view model must be single so we correctly attach lifecycle and share it with activity
437444
single { MullvadAppViewModel(get(), get()) }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
plugins { alias(libs.plugins.mullvad.android.library.feature.api) }
2+
3+
android { namespace = "net.mullvad.mullvadvpn.feature.dns.api" }
4+
5+
dependencies { implementation(projects.lib.model) }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.mullvad.mullvadvpn.feature.dns.api
2+
3+
import kotlinx.parcelize.Parcelize
4+
import net.mullvad.mullvadvpn.core.NavKey2
5+
6+
@Parcelize
7+
data object ContentBlockersInfoNavKey : NavKey2
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package net.mullvad.mullvadvpn.feature.dns.api
2+
3+
import kotlinx.parcelize.Parcelize
4+
import net.mullvad.mullvadvpn.core.NavKey2
5+
6+
@Parcelize data object CustomDnsInfoNavKey : NavKey2
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.mullvad.mullvadvpn.feature.dns.api
2+
3+
import kotlinx.parcelize.Parcelize
4+
import net.mullvad.mullvadvpn.core.NavKey2
5+
import net.mullvad.mullvadvpn.core.NavResult
6+
7+
@Parcelize data class CustomDnsNavKey(val index: Int? = null, val initialValue: String? = null) : NavKey2
8+
9+
sealed interface CustomDnsNavResult : NavResult {
10+
@Parcelize data class Success(val isDnsListEmpty: Boolean) : CustomDnsNavResult
11+
12+
@Parcelize data object Error : CustomDnsNavResult
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.mullvad.mullvadvpn.feature.dns.api
2+
3+
import kotlinx.parcelize.Parcelize
4+
import net.mullvad.mullvadvpn.core.NavKey2
5+
import net.mullvad.mullvadvpn.lib.model.FeatureIndicator
6+
7+
@Parcelize
8+
data class DnsSettingsNavKey(val selectedFeature: FeatureIndicator? = null, val isModal: Boolean = false) :
9+
NavKey2
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.mullvad.mullvadvpn.feature.dns.api
2+
3+
import kotlinx.parcelize.Parcelize
4+
import net.mullvad.mullvadvpn.core.NavKey2
5+
6+
@Parcelize
7+
data object MalwareInfoNavKey : NavKey2
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
plugins {
2+
alias(libs.plugins.mullvad.android.library)
3+
alias(libs.plugins.mullvad.android.library.feature.impl)
4+
alias(libs.plugins.mullvad.android.library.compose)
5+
alias(libs.plugins.kotlin.parcelize)
6+
alias(libs.plugins.kotlin.ksp)
7+
}
8+
9+
android { namespace = "net.mullvad.mullvadvpn.feature.dns.impl" }
10+
11+
dependencies {
12+
implementation(projects.lib.feature.dns.api)
13+
implementation(projects.lib.repository)
14+
implementation(projects.lib.usecase)
15+
implementation(projects.lib.ui.util)
16+
17+
implementation(libs.koin.compose)
18+
implementation(libs.arrow)
19+
// This dependency can be replaced when minimum SDK is 29 or higher.
20+
// It can then be replaced with InetAddress.isNumericAddress
21+
implementation(libs.commons.validator) {
22+
// This dependency has a known vulnerability
23+
// https://osv.dev/vulnerability/GHSA-wxr5-93ph-8wr9
24+
// It is not used so let's exclude it.
25+
// Unfortunately, this is not possible to do using libs.version.toml
26+
// https://github.com/gradle/gradle/issues/26367#issuecomment-2120830998
27+
exclude("commons-beanutils", "commons-beanutils")
28+
}
29+
}

0 commit comments

Comments
 (0)