summaryrefslogtreecommitdiffhomepage
path: root/android/lib/model/src
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2023-07-25 15:34:48 +0200
committerAlbin <albin@mullvad.net>2023-07-25 16:03:51 +0200
commitc57796d3a13840740ef31c1efc7f6d1022da2de6 (patch)
tree30bb60dc8194d9a2c1a44fa1d13ff866808b95ef /android/lib/model/src
parentd8217899bf2b7a3cd999e0d3d704016e3b707539 (diff)
downloadmullvadvpn-c57796d3a13840740ef31c1efc7f6d1022da2de6.tar.xz
mullvadvpn-c57796d3a13840740ef31c1efc7f6d1022da2de6.zip
Move model classes to model module
Diffstat (limited to 'android/lib/model/src')
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountAndDevice.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountCreationResult.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountData.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountExpiry.kt15
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountHistory.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AppVersionInfo.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomDnsOptions.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomTunnelEndpoint.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt17
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt37
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEvent.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEventCause.kt13
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceList.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceListEvent.kt15
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DevicePort.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceState.kt28
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt14
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeographicLocationConstraint.kt28
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginResult.kt13
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Port.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraintsUpdate.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayEndpointData.kt14
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceEvent.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceResult.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SelectedObfuscation.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ServiceResult.kt23
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt14
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt82
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Udp2TcpObfuscationSettings.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmission.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardConstraints.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardRelayEndpointData.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt8
53 files changed, 638 insertions, 0 deletions
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountAndDevice.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountAndDevice.kt
new file mode 100644
index 0000000000..f5137ebbb7
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountAndDevice.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class AccountAndDevice(val account_token: String, val device: Device) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountCreationResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountCreationResult.kt
new file mode 100644
index 0000000000..4bb4c61384
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountCreationResult.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class AccountCreationResult : Parcelable {
+ @Parcelize data class Success(val accountToken: String) : AccountCreationResult()
+
+ @Parcelize object Failure : AccountCreationResult()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountData.kt
new file mode 100644
index 0000000000..6dda6b8352
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountData.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.model
+
+data class AccountData(val expiry: String)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountExpiry.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountExpiry.kt
new file mode 100644
index 0000000000..a91ce46148
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountExpiry.kt
@@ -0,0 +1,15 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import org.joda.time.DateTime
+
+sealed class AccountExpiry : Parcelable {
+ @Parcelize data class Available(val expiryDateTime: DateTime) : AccountExpiry()
+
+ @Parcelize object Missing : AccountExpiry()
+
+ fun date(): DateTime? {
+ return (this as? Available)?.expiryDateTime
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountHistory.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountHistory.kt
new file mode 100644
index 0000000000..008eb1ea7a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountHistory.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.android.parcel.Parcelize
+
+sealed class AccountHistory : Parcelable {
+ @Parcelize data class Available(val accountToken: String) : AccountHistory()
+
+ @Parcelize object Missing : AccountHistory()
+
+ fun accountToken() = (this as? Available)?.accountToken
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AppVersionInfo.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AppVersionInfo.kt
new file mode 100644
index 0000000000..bbe99ce656
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AppVersionInfo.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class AppVersionInfo(val supported: Boolean, val suggestedUpgrade: String?) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt
new file mode 100644
index 0000000000..c6dc2bb091
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class Constraint<T>() : Parcelable {
+ @Parcelize
+ @Suppress("PARCELABLE_PRIMARY_CONSTRUCTOR_IS_EMPTY")
+ class Any<T>() : Constraint<T>()
+
+ @Parcelize data class Only<T : Parcelable>(val value: T) : Constraint<T>()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomDnsOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomDnsOptions.kt
new file mode 100644
index 0000000000..bbf029dd4d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomDnsOptions.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import java.net.InetAddress
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class CustomDnsOptions(val addresses: ArrayList<InetAddress>) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomTunnelEndpoint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomTunnelEndpoint.kt
new file mode 100644
index 0000000000..05dd38a80b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomTunnelEndpoint.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.model
+
+class CustomTunnelEndpoint()
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt
new file mode 100644
index 0000000000..eb22c93994
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt
@@ -0,0 +1,17 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class DefaultDnsOptions(
+ val blockAds: Boolean = false,
+ val blockTrackers: Boolean = false,
+ val blockMalware: Boolean = false,
+ val blockAdultContent: Boolean = false,
+ val blockGambling: Boolean = false,
+) : Parcelable {
+ fun isAnyBlockerEnabled(): Boolean {
+ return blockAds || blockTrackers || blockMalware || blockAdultContent || blockGambling
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
new file mode 100644
index 0000000000..a9ad4ec874
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
@@ -0,0 +1,37 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class Device(
+ val id: String,
+ val name: String,
+ val pubkey: ByteArray,
+ val ports: ArrayList<DevicePort>,
+ val created: String
+) : Parcelable {
+ // Generated by Android Studio
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as Device
+
+ if (id != other.id) return false
+ if (name != other.name) return false
+ if (!pubkey.contentEquals(other.pubkey)) return false
+ if (ports != other.ports) return false
+
+ return true
+ }
+
+ // Generated by Android Studio
+ override fun hashCode(): Int {
+ var result = id.hashCode()
+ result = 31 * result + name.hashCode()
+ result = 31 * result + pubkey.contentHashCode()
+ result = 31 * result + ports.hashCode()
+ return result
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEvent.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEvent.kt
new file mode 100644
index 0000000000..741108612d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEvent.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class DeviceEvent(val cause: DeviceEventCause, val newState: DeviceState) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEventCause.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEventCause.kt
new file mode 100644
index 0000000000..b4c1d21761
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEventCause.kt
@@ -0,0 +1,13 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class DeviceEventCause : Parcelable {
+ LoggedIn,
+ LoggedOut,
+ Revoked,
+ Updated,
+ RotatedKey
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceList.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceList.kt
new file mode 100644
index 0000000000..de1acb0e23
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceList.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class DeviceList {
+ object Unavailable : DeviceList()
+ data class Available(val devices: List<Device>) : DeviceList()
+ object Error : DeviceList()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceListEvent.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceListEvent.kt
new file mode 100644
index 0000000000..7a2883617b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceListEvent.kt
@@ -0,0 +1,15 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class DeviceListEvent : Parcelable {
+ @Parcelize
+ data class Available(val accountToken: String, val devices: List<Device>) : DeviceListEvent()
+
+ @Parcelize object Error : DeviceListEvent()
+
+ fun isAvailable(): Boolean {
+ return (this is Available)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DevicePort.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DevicePort.kt
new file mode 100644
index 0000000000..e43eae3e6b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DevicePort.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class DevicePort(val id: String) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceState.kt
new file mode 100644
index 0000000000..440d03de55
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceState.kt
@@ -0,0 +1,28 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class DeviceState : Parcelable {
+ @Parcelize object Initial : DeviceState()
+
+ @Parcelize object Unknown : DeviceState()
+
+ @Parcelize data class LoggedIn(val accountAndDevice: AccountAndDevice) : DeviceState()
+
+ @Parcelize object LoggedOut : DeviceState()
+
+ @Parcelize object Revoked : DeviceState()
+
+ fun isUnknown(): Boolean {
+ return this is Unknown
+ }
+
+ fun deviceName(): String? {
+ return (this as? LoggedIn)?.accountAndDevice?.device?.name
+ }
+
+ fun token(): String? {
+ return (this as? LoggedIn)?.accountAndDevice?.account_token
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt
new file mode 100644
index 0000000000..1ce3acc095
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class DnsOptions(
+ val state: DnsState,
+ val defaultOptions: DefaultDnsOptions,
+ val customOptions: CustomDnsOptions
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt
new file mode 100644
index 0000000000..9c8677ba7d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+enum class DnsState {
+ Default,
+ Custom
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt
new file mode 100644
index 0000000000..e15ab20376
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt
@@ -0,0 +1,14 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import java.net.InetAddress
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class GeoIpLocation(
+ val ipv4: InetAddress?,
+ val ipv6: InetAddress?,
+ val country: String,
+ val city: String?,
+ val hostname: String?
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeographicLocationConstraint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeographicLocationConstraint.kt
new file mode 100644
index 0000000000..04f92a72ac
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeographicLocationConstraint.kt
@@ -0,0 +1,28 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class GeographicLocationConstraint : Parcelable {
+ abstract val location: GeoIpLocation
+
+ @Parcelize
+ data class Country(val countryCode: String) : GeographicLocationConstraint() {
+ override val location: GeoIpLocation
+ get() = GeoIpLocation(null, null, countryCode, null, null)
+ }
+
+ @Parcelize
+ data class City(val countryCode: String, val cityCode: String) :
+ GeographicLocationConstraint() {
+ override val location: GeoIpLocation
+ get() = GeoIpLocation(null, null, countryCode, cityCode, null)
+ }
+
+ @Parcelize
+ data class Hostname(val countryCode: String, val cityCode: String, val hostname: String) :
+ GeographicLocationConstraint() {
+ override val location: GeoIpLocation
+ get() = GeoIpLocation(null, null, countryCode, cityCode, hostname)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt
new file mode 100644
index 0000000000..cbed622df6
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class GetAccountDataResult {
+ class Ok(val accountData: AccountData) : GetAccountDataResult()
+ object InvalidAccount : GetAccountDataResult()
+ object RpcError : GetAccountDataResult()
+ object OtherError : GetAccountDataResult()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt
new file mode 100644
index 0000000000..de7dd4e99b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class LocationConstraint : Parcelable {
+ @Parcelize
+ data class Location(val location: GeographicLocationConstraint) : LocationConstraint()
+ @Parcelize data class CustomList(val listId: String) : LocationConstraint()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginResult.kt
new file mode 100644
index 0000000000..29fb68203d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginResult.kt
@@ -0,0 +1,13 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class LoginResult : Parcelable {
+ Ok,
+ InvalidAccount,
+ MaxDevicesReached,
+ RpcError,
+ OtherError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt
new file mode 100644
index 0000000000..19b5c0e5f2
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class ObfuscationSettings(
+ val selectedObfuscation: SelectedObfuscation,
+ val udp2tcp: Udp2TcpObfuscationSettings
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Port.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Port.kt
new file mode 100644
index 0000000000..52f495a7a7
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Port.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class Port(val value: Int) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt
new file mode 100644
index 0000000000..376f5ef7a4
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class PortRange(val from: Int, val to: Int) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt
new file mode 100644
index 0000000000..169b6c3856
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class PublicKey(val key: ByteArray, val dateCreated: String) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt
new file mode 100644
index 0000000000..a19267388a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class QuantumResistantState : Parcelable {
+ Auto,
+ On,
+ Off
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt
new file mode 100644
index 0000000000..b1abdc3c75
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class Relay(val hostname: String, val active: Boolean, val endpointData: RelayEndpointData) :
+ Parcelable {
+ val isWireguardRelay
+ get() = endpointData is RelayEndpointData.Wireguard
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt
new file mode 100644
index 0000000000..da2acb39f6
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class RelayConstraints(
+ val location: Constraint<LocationConstraint>,
+ val wireguardConstraints: WireguardConstraints
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraintsUpdate.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraintsUpdate.kt
new file mode 100644
index 0000000000..bd5bfb9605
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraintsUpdate.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+data class RelayConstraintsUpdate(
+ var location: Constraint<LocationConstraint>?,
+ var wireguardConstraints: WireguardConstraints?
+)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayEndpointData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayEndpointData.kt
new file mode 100644
index 0000000000..86b3f0fa35
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayEndpointData.kt
@@ -0,0 +1,14 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class RelayEndpointData : Parcelable {
+ @Parcelize object Openvpn : RelayEndpointData()
+
+ @Parcelize object Bridge : RelayEndpointData()
+
+ @Parcelize
+ data class Wireguard(val wireguardRelayEndpointData: WireguardRelayEndpointData) :
+ RelayEndpointData()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt
new file mode 100644
index 0000000000..60d8b6dd35
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class RelayList(
+ val countries: ArrayList<RelayListCountry>,
+ val wireguardEndpointData: WireguardEndpointData
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt
new file mode 100644
index 0000000000..2376609ced
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class RelayListCity(val name: String, val code: String, val relays: ArrayList<Relay>) :
+ Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt
new file mode 100644
index 0000000000..d6d4b8ec6a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class RelayListCountry(
+ val name: String,
+ val code: String,
+ val cities: ArrayList<RelayListCity>
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
new file mode 100644
index 0000000000..7832a00e77
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class RelaySettings : Parcelable {
+ @Parcelize object CustomTunnelEndpoint : RelaySettings()
+
+ @Parcelize class Normal(val relayConstraints: RelayConstraints) : RelaySettings()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt
new file mode 100644
index 0000000000..85f5de2a32
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettingsUpdate.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+sealed class RelaySettingsUpdate {
+ object CustomTunnelEndpoint : RelaySettingsUpdate()
+ data class Normal(var constraints: RelayConstraintsUpdate) : RelaySettingsUpdate()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceEvent.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceEvent.kt
new file mode 100644
index 0000000000..cc6e7db2bb
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceEvent.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class RemoveDeviceEvent(val accountToken: String, val newDevices: ArrayList<Device>) :
+ Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceResult.kt
new file mode 100644
index 0000000000..67bf165a37
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceResult.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class RemoveDeviceResult : Parcelable {
+ Ok,
+ NotFound,
+ RpcError,
+ OtherError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SelectedObfuscation.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SelectedObfuscation.kt
new file mode 100644
index 0000000000..8124bcc6a6
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SelectedObfuscation.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class SelectedObfuscation : Parcelable {
+ Auto,
+ Off,
+ Udp2Tcp
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ServiceResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ServiceResult.kt
new file mode 100644
index 0000000000..e597797e5a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ServiceResult.kt
@@ -0,0 +1,23 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.IBinder
+
+data class ServiceResult(val binder: IBinder?) {
+ enum class ConnectionState {
+ CONNECTED,
+ DISCONNECTED
+ }
+
+ val connectionState: ConnectionState
+ get() {
+ return if (binder == null) {
+ ConnectionState.DISCONNECTED
+ } else {
+ ConnectionState.CONNECTED
+ }
+ }
+
+ companion object {
+ val NOT_CONNECTED = ServiceResult(null)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
new file mode 100644
index 0000000000..0d45b38179
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
@@ -0,0 +1,14 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class Settings(
+ val relaySettings: RelaySettings,
+ val obfuscationSettings: ObfuscationSettings,
+ val allowLan: Boolean,
+ val autoConnect: Boolean,
+ val tunnelOptions: TunnelOptions,
+ val showBetaReleases: Boolean
+) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
new file mode 100644
index 0000000000..108fd32e04
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class TunnelOptions(val wireguard: WireguardTunnelOptions, val dnsOptions: DnsOptions) :
+ Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt
new file mode 100644
index 0000000000..c3d58d2ca7
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt
@@ -0,0 +1,82 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import net.mullvad.talpid.net.TunnelEndpoint
+import net.mullvad.talpid.tunnel.ActionAfterDisconnect
+import net.mullvad.talpid.tunnel.ErrorState
+import net.mullvad.talpid.tunnel.ErrorStateCause
+
+sealed class TunnelState : Parcelable {
+ @Parcelize object Disconnected : TunnelState(), Parcelable
+
+ @Parcelize
+ class Connecting(val endpoint: TunnelEndpoint?, val location: GeoIpLocation?) :
+ TunnelState(), Parcelable
+
+ @Parcelize
+ class Connected(val endpoint: TunnelEndpoint, val location: GeoIpLocation?) :
+ TunnelState(), Parcelable
+
+ @Parcelize
+ class Disconnecting(val actionAfterDisconnect: ActionAfterDisconnect) :
+ TunnelState(), Parcelable
+
+ @Parcelize class Error(val errorState: ErrorState) : TunnelState(), Parcelable
+
+ fun isSecured(): Boolean {
+ return when (this) {
+ is Connected,
+ is Connecting,
+ is Disconnecting, -> true
+ is Disconnected -> false
+ is Error -> this.errorState.isBlocking
+ }
+ }
+
+ companion object {
+ const val DISCONNECTED = "disconnected"
+ const val CONNECTING = "connecting"
+ const val CONNECTED = "connected"
+ const val RECONNECTING = "reconnecting"
+ const val DISCONNECTING = "disconnecting"
+ const val BLOCKING = "blocking"
+ const val ERROR = "error"
+
+ fun fromString(description: String, endpoint: TunnelEndpoint?): TunnelState {
+ return when (description) {
+ DISCONNECTED -> Disconnected
+ CONNECTING -> Connecting(endpoint, null)
+ CONNECTED -> Connected(endpoint!!, null)
+ RECONNECTING -> Disconnecting(ActionAfterDisconnect.Reconnect)
+ DISCONNECTING -> Disconnecting(ActionAfterDisconnect.Nothing)
+ BLOCKING -> Error(ErrorState(ErrorStateCause.StartTunnelError, true))
+ ERROR -> {
+ Error(ErrorState(ErrorStateCause.SetFirewallPolicyError, false))
+ }
+ else -> Error(ErrorState(ErrorStateCause.SetFirewallPolicyError, false))
+ }
+ }
+ }
+
+ override fun toString(): String =
+ when (this) {
+ is Disconnected -> DISCONNECTED
+ is Connecting -> CONNECTING
+ is Connected -> CONNECTED
+ is Disconnecting -> {
+ if (actionAfterDisconnect == ActionAfterDisconnect.Reconnect) {
+ RECONNECTING
+ } else {
+ DISCONNECTING
+ }
+ }
+ is Error -> {
+ if (errorState.isBlocking) {
+ BLOCKING
+ } else {
+ ERROR
+ }
+ }
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Udp2TcpObfuscationSettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Udp2TcpObfuscationSettings.kt
new file mode 100644
index 0000000000..f01bb35c6f
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Udp2TcpObfuscationSettings.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class Udp2TcpObfuscationSettings(val port: Constraint<Int>) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmission.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmission.kt
new file mode 100644
index 0000000000..efe05e2f5c
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmission.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class VoucherSubmission(val timeAdded: Long, val newExpiry: String) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt
new file mode 100644
index 0000000000..1cf778400a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class VoucherSubmissionError : Parcelable {
+ InvalidVoucher,
+ VoucherAlreadyUsed,
+ RpcError,
+ OtherError,
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt
new file mode 100644
index 0000000000..4163b782d4
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class VoucherSubmissionResult : Parcelable {
+ @Parcelize data class Ok(val submission: VoucherSubmission) : VoucherSubmissionResult()
+
+ @Parcelize data class Error(val error: VoucherSubmissionError) : VoucherSubmissionResult()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardConstraints.kt
new file mode 100644
index 0000000000..1725b01f0f
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardConstraints.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class WireguardConstraints(val port: Constraint<Port>) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt
new file mode 100644
index 0000000000..0a21221bb0
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize data class WireguardEndpointData(val portRanges: ArrayList<PortRange>) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardRelayEndpointData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardRelayEndpointData.kt
new file mode 100644
index 0000000000..4a1930dd43
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardRelayEndpointData.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize object WireguardRelayEndpointData : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt
new file mode 100644
index 0000000000..f4a869a4ea
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: QuantumResistantState) :
+ Parcelable