summaryrefslogtreecommitdiffhomepage
path: root/android/lib/model/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-05-29 17:18:29 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-05-29 17:18:29 +0200
commitad90145a5d86d8c1e6e70f2238f11edf5e50f8d8 (patch)
tree9d085bc81caed9409e3a4360490c06c2da4fbba8 /android/lib/model/src
parent8e14a8d4287af66a57a98db79d3ac320c2dad4a1 (diff)
parent767b97eda756f4ec4e67fb5fa2ae664277291e8f (diff)
downloadmullvadvpn-ad90145a5d86d8c1e6e70f2238f11edf5e50f8d8.tar.xz
mullvadvpn-ad90145a5d86d8c1e6e70f2238f11edf5e50f8d8.zip
Merge branch 'android-grpc'
Diffstat (limited to 'android/lib/model/src')
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountData.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountId.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountToken.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ActionAfterDisconnect.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AddSplitTunnelingAppError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppId.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppVersionInfo.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/BuildVersion.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ClearAllOverridesError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ConnectError.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt21
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateAccountError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateCustomListError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomDnsOptions.kt9
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomList.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomListName.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListName.kt)2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DefaultDnsOptions.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt)11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteCustomListError.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteDeviceError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Device.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceId.kt13
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceState.kt21
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DnsOptions.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt)11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DnsState.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt)2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/EnableSplitTunnelingError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Endpoint.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorState.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorStateCause.kt34
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt)7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountDataError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountHistoryError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceListError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceStateError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LatLong.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LatLong.kt)4
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Latitude.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Latitude.kt)2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ListDevicesError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LoginAccountError.kt15
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Longitude.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Longitude.kt)2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Mtu.kt28
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Notification.kt25
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationAction.kt20
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannel.kt15
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannelId.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationId.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt25
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationUpdate.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationEndpoint.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationSettings.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt)11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Ownership.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ParameterGenerationError.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchase.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseInitError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchasePaymentToken.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseVerifyError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PortRange.kt30
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Provider.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ProviderId.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Providers.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/QuantumResistantState.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherSuccess.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayConstraints.kt13
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt88
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemId.kt48
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayList.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayOverride.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayOverride.kt)11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelaySettings.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveDeviceError.kt9
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveSplitTunnelingAppError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SelectedObfuscation.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAllowLanError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAutoConnectError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDnsOptionsError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetObfuscationOptionsError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetRelayLocationError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardConstraintsError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardMtuError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardQuantumResistantError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt)16
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SettingsPatchError.kt (renamed from android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SettingsPatchError.kt)8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SplitTunnelSettings.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TransportProtocol.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelOptions.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt35
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Udp2TcpObfuscationSettings.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/UpdateCustomListError.kt35
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WebsiteAuthToken.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardEndpointData.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/extensions/String.kt6
-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/AccountToken.kt3
-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.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CreateCustomListResult.kt10
-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/CustomList.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsError.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsSettings.kt6
-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/Device.kt40
-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.kt9
-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/GeographicLocationConstraint.kt28
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt11
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt11
-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/Ownership.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchase.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitError.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitResult.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyError.kt10
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyResult.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/Providers.kt9
-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.kt16
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt12
-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.kt12
-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/TunnelOptions.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt46
-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/UpdateCustomListResult.kt10
-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
-rw-r--r--android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatLongTest.kt (renamed from android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatLongTest.kt)2
-rw-r--r--android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatitudeTest.kt (renamed from android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatitudeTest.kt)2
-rw-r--r--android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LongitudeTest.kt (renamed from android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LongitudeTest.kt)2
155 files changed, 889 insertions, 692 deletions
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountData.kt
new file mode 100644
index 0000000000..60395721d8
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountData.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import org.joda.time.DateTime
+
+data class AccountData(
+ val id: AccountId,
+ val expiryDate: DateTime,
+)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountId.kt
new file mode 100644
index 0000000000..75550259fd
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountId.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import java.util.UUID
+
+@JvmInline
+value class AccountId(val value: UUID) {
+ companion object {
+ fun fromString(value: String) = AccountId(UUID.fromString(value))
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountToken.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountToken.kt
new file mode 100644
index 0000000000..d03a0d6721
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AccountToken.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@JvmInline @Parcelize value class AccountToken(val value: String) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ActionAfterDisconnect.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ActionAfterDisconnect.kt
new file mode 100644
index 0000000000..531fc1c073
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ActionAfterDisconnect.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class ActionAfterDisconnect {
+ Nothing,
+ Block,
+ Reconnect
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AddSplitTunnelingAppError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AddSplitTunnelingAppError.kt
new file mode 100644
index 0000000000..338162db8c
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AddSplitTunnelingAppError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+interface AddSplitTunnelingAppError {
+ data class Unknown(val throwable: Throwable) : AddSplitTunnelingAppError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppId.kt
new file mode 100644
index 0000000000..0663b530a1
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppId.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline value class AppId(val value: String)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppVersionInfo.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppVersionInfo.kt
new file mode 100644
index 0000000000..9af168bf28
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/AppVersionInfo.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class AppVersionInfo(val supported: Boolean, val suggestedUpgrade: String?)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/BuildVersion.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/BuildVersion.kt
new file mode 100644
index 0000000000..980ea23961
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/BuildVersion.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class BuildVersion(val name: String, val code: Int)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ClearAllOverridesError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ClearAllOverridesError.kt
new file mode 100644
index 0000000000..ce1bc0af12
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ClearAllOverridesError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface ClearAllOverridesError {
+ data class Unknown(val throwable: Throwable) : ClearAllOverridesError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ConnectError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ConnectError.kt
new file mode 100644
index 0000000000..307a235314
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ConnectError.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface ConnectError {
+ data class Unknown(val throwable: Throwable) : ConnectError
+
+ data object NoVpnPermission : ConnectError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt
new file mode 100644
index 0000000000..95e7d95154
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt
@@ -0,0 +1,21 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+sealed interface Constraint<out T> {
+ data object Any : Constraint<Nothing>
+
+ @optics
+ data class Only<T>(val value: T) : Constraint<T> {
+ companion object
+ }
+
+ fun getOrNull(): T? =
+ when (this) {
+ Any -> null
+ is Only -> value
+ }
+
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateAccountError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateAccountError.kt
new file mode 100644
index 0000000000..eeeaf11fca
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateAccountError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed class CreateAccountError {
+ data class Unknown(val error: Throwable) : CreateAccountError()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateCustomListError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateCustomListError.kt
new file mode 100644
index 0000000000..adbac22d9b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateCustomListError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface CreateCustomListError
+
+data object CustomListAlreadyExists : CreateCustomListError
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomDnsOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomDnsOptions.kt
new file mode 100644
index 0000000000..4fd64b2892
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomDnsOptions.kt
@@ -0,0 +1,9 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+import java.net.InetAddress
+
+@optics
+data class CustomDnsOptions(val addresses: List<InetAddress>) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomList.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomList.kt
new file mode 100644
index 0000000000..ed43ac1097
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomList.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class CustomList(
+ val id: CustomListId,
+ val name: CustomListName,
+ val locations: List<GeoLocationId>
+) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListName.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomListName.kt
index 5822eec2b3..186d74dc92 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListName.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CustomListName.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
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/lib/model/DefaultDnsOptions.kt
index 69f4d4d220..6979320ce6 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DefaultDnsOptions.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DefaultDnsOptions.kt
@@ -1,9 +1,8 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
+import arrow.optics.optics
-@Parcelize
+@optics
data class DefaultDnsOptions(
val blockAds: Boolean = false,
val blockTrackers: Boolean = false,
@@ -11,7 +10,7 @@ data class DefaultDnsOptions(
val blockAdultContent: Boolean = false,
val blockGambling: Boolean = false,
val blockSocialMedia: Boolean = false,
-) : Parcelable {
+) {
fun isAnyBlockerEnabled(): Boolean {
return blockAds ||
blockTrackers ||
@@ -20,4 +19,6 @@ data class DefaultDnsOptions(
blockGambling ||
blockSocialMedia
}
+
+ companion object
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteCustomListError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteCustomListError.kt
new file mode 100644
index 0000000000..d9c93c87cf
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteCustomListError.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface DeleteCustomListError
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteDeviceError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteDeviceError.kt
new file mode 100644
index 0000000000..1c6c54bcf0
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeleteDeviceError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface DeleteDeviceError {
+ data class Unknown(val error: Throwable) : DeleteDeviceError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Device.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Device.kt
new file mode 100644
index 0000000000..e8303f0eca
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Device.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import net.mullvad.mullvadvpn.lib.model.extensions.startCase
+import org.joda.time.DateTime
+
+@Parcelize
+data class Device(val id: DeviceId, private val name: String, val creationDate: DateTime) :
+ Parcelable {
+ fun displayName(): String = name.startCase()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceId.kt
new file mode 100644
index 0000000000..863d15fd67
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceId.kt
@@ -0,0 +1,13 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import java.util.UUID
+import kotlinx.parcelize.Parcelize
+
+@JvmInline
+@Parcelize
+value class DeviceId(val value: UUID) : Parcelable {
+ companion object {
+ fun fromString(value: String): DeviceId = DeviceId(UUID.fromString(value))
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceState.kt
new file mode 100644
index 0000000000..4546cd46b3
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DeviceState.kt
@@ -0,0 +1,21 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+sealed class DeviceState : Parcelable {
+ @Parcelize
+ data class LoggedIn(val accountToken: AccountToken, val device: Device) : DeviceState()
+
+ @Parcelize data object LoggedOut : DeviceState()
+
+ @Parcelize data object Revoked : DeviceState()
+
+ fun displayName(): String? {
+ return (this as? LoggedIn)?.device?.displayName()
+ }
+
+ fun token(): AccountToken? {
+ return (this as? LoggedIn)?.accountToken
+ }
+}
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/lib/model/DnsOptions.kt
index 1ce3acc095..ae27e47457 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DnsOptions.kt
@@ -1,11 +1,12 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
+import arrow.optics.optics
-@Parcelize
+@optics
data class DnsOptions(
val state: DnsState,
val defaultOptions: DefaultDnsOptions,
val customOptions: CustomDnsOptions
-) : Parcelable
+) {
+ companion object
+}
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/lib/model/DnsState.kt
index 9c8677ba7d..4bf053eef1 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsState.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/DnsState.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
enum class DnsState {
Default,
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/EnableSplitTunnelingError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/EnableSplitTunnelingError.kt
new file mode 100644
index 0000000000..43a4cc41b1
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/EnableSplitTunnelingError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+interface EnableSplitTunnelingError {
+ data class Unknown(val throwable: Throwable) : EnableSplitTunnelingError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Endpoint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Endpoint.kt
new file mode 100644
index 0000000000..4eae8b08ec
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Endpoint.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import java.net.InetSocketAddress
+
+data class Endpoint(val address: InetSocketAddress, val protocol: TransportProtocol)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorState.kt
new file mode 100644
index 0000000000..fb7673b7b5
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorState.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class ErrorState(val cause: ErrorStateCause, val isBlocking: Boolean)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorStateCause.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorStateCause.kt
new file mode 100644
index 0000000000..0ba63a4b08
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ErrorStateCause.kt
@@ -0,0 +1,34 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import java.net.InetAddress
+
+sealed class ErrorStateCause {
+ class AuthFailed(private val reason: String?) : ErrorStateCause() {
+ fun isCausedByExpiredAccount(): Boolean {
+ return reason == AUTH_FAILED_REASON_EXPIRED_ACCOUNT
+ }
+
+ companion object {
+ private const val AUTH_FAILED_REASON_EXPIRED_ACCOUNT = "[EXPIRED_ACCOUNT]"
+ }
+ }
+
+ data object Ipv6Unavailable : ErrorStateCause()
+
+ sealed class FirewallPolicyError : ErrorStateCause() {
+ data object Generic : FirewallPolicyError()
+ }
+
+ data object DnsError : ErrorStateCause()
+
+ // Regression
+ data class InvalidDnsServers(val addresses: List<InetAddress>) : ErrorStateCause()
+
+ data object StartTunnelError : ErrorStateCause()
+
+ data class TunnelParameterError(val error: ParameterGenerationError) : ErrorStateCause()
+
+ data object IsOffline : ErrorStateCause()
+
+ data object VpnPermissionDenied : ErrorStateCause()
+}
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/lib/model/GeoIpLocation.kt
index 625de76b29..3334b458d7 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeoIpLocation.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt
@@ -1,10 +1,7 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
import java.net.InetAddress
-import kotlinx.parcelize.Parcelize
-@Parcelize
data class GeoIpLocation(
val ipv4: InetAddress?,
val ipv6: InetAddress?,
@@ -13,4 +10,4 @@ data class GeoIpLocation(
val latitude: Double,
val longitude: Double,
val hostname: String?,
-) : Parcelable
+)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountDataError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountDataError.kt
new file mode 100644
index 0000000000..6f3ba64848
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountDataError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface GetAccountDataError {
+ data class Unknown(val error: Throwable) : GetAccountDataError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountHistoryError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountHistoryError.kt
new file mode 100644
index 0000000000..7803a98ad1
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetAccountHistoryError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface GetAccountHistoryError {
+ data class Unknown(val error: Throwable) : GetAccountHistoryError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceListError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceListError.kt
new file mode 100644
index 0000000000..bcad016580
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceListError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface GetDeviceListError {
+ data class Unknown(val error: Throwable) : GetDeviceListError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceStateError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceStateError.kt
new file mode 100644
index 0000000000..675973ee1e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GetDeviceStateError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface GetDeviceStateError {
+ data class Unknown(val error: Throwable) : GetDeviceStateError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LatLong.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LatLong.kt
index d6749a16a2..19f757ffc3 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LatLong.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LatLong.kt
@@ -1,9 +1,9 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.cos
import kotlin.math.pow
import kotlin.math.sqrt
-import net.mullvad.mullvadvpn.model.Latitude.Companion.mean
+import net.mullvad.mullvadvpn.lib.model.Latitude.Companion.mean
data class LatLong(val latitude: Latitude, val longitude: Longitude) {
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Latitude.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Latitude.kt
index 21d113f3bc..9b0cc7fbbe 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Latitude.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Latitude.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.absoluteValue
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ListDevicesError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ListDevicesError.kt
new file mode 100644
index 0000000000..6530450d42
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ListDevicesError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+interface ListDevicesError {
+ data class Unknown(val throwable: Throwable) : ListDevicesError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LoginAccountError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LoginAccountError.kt
new file mode 100644
index 0000000000..1c58f80bee
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LoginAccountError.kt
@@ -0,0 +1,15 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+sealed class LoginAccountError : Parcelable {
+ data object InvalidAccount : LoginAccountError()
+
+ data class MaxDevicesReached(val accountToken: AccountToken) : LoginAccountError()
+
+ data object RpcError : LoginAccountError()
+
+ data class Unknown(val error: Throwable) : LoginAccountError()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Longitude.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Longitude.kt
index 9f73a6ff17..b772801da7 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Longitude.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Longitude.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.absoluteValue
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Mtu.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Mtu.kt
new file mode 100644
index 0000000000..68b4b71bd9
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Mtu.kt
@@ -0,0 +1,28 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import arrow.core.Either
+import arrow.core.raise.either
+import arrow.core.raise.ensure
+import kotlinx.parcelize.Parcelize
+
+@JvmInline
+@Parcelize
+value class Mtu(val value: Int) : Parcelable {
+ companion object {
+ fun fromString(value: String): Either<ParseMtuError, Mtu> = either {
+ val number = value.toIntOrNull() ?: raise(ParseMtuError.NotANumber)
+ ensure(number in MIN_VALUE..MAX_VALUE) { ParseMtuError.OutOfRange(number) }
+ Mtu(number)
+ }
+
+ private const val MIN_VALUE = 1280
+ private const val MAX_VALUE = 1420
+ }
+}
+
+sealed interface ParseMtuError {
+ data object NotANumber : ParseMtuError
+
+ data class OutOfRange(val number: Int) : ParseMtuError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Notification.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Notification.kt
new file mode 100644
index 0000000000..5dda03aa9d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Notification.kt
@@ -0,0 +1,25 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import org.joda.time.Duration
+
+sealed interface Notification {
+ val actions: List<NotificationAction>
+ val ongoing: Boolean
+ val channelId: NotificationChannelId
+
+ data class Tunnel(
+ override val channelId: NotificationChannelId,
+ val state: NotificationTunnelState,
+ override val actions: List<NotificationAction.Tunnel>,
+ override val ongoing: Boolean,
+ ) : Notification
+
+ data class AccountExpiry(
+ override val channelId: NotificationChannelId,
+ override val actions: List<NotificationAction.AccountExpiry>,
+ val websiteAuthToken: WebsiteAuthToken?,
+ val durationUntilExpiry: Duration
+ ) : Notification {
+ override val ongoing: Boolean = false
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationAction.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationAction.kt
new file mode 100644
index 0000000000..ec938a9fbf
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationAction.kt
@@ -0,0 +1,20 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface NotificationAction {
+
+ sealed interface AccountExpiry : NotificationAction {
+ data object Open : AccountExpiry
+ }
+
+ sealed interface Tunnel : NotificationAction {
+ data object Connect : Tunnel
+
+ data object Disconnect : Tunnel
+
+ data object Cancel : Tunnel
+
+ data object Dismiss : Tunnel
+
+ data object RequestPermission : Tunnel
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannel.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannel.kt
new file mode 100644
index 0000000000..166c20b826
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannel.kt
@@ -0,0 +1,15 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface NotificationChannel {
+ val id: NotificationChannelId
+
+ data object TunnelUpdates : NotificationChannel {
+ private const val CHANNEL_ID = "vpn_tunnel_status"
+ override val id: NotificationChannelId = NotificationChannelId(CHANNEL_ID)
+ }
+
+ data object AccountUpdates : NotificationChannel {
+ private const val CHANNEL_ID = "mullvad_account_time"
+ override val id: NotificationChannelId = NotificationChannelId(CHANNEL_ID)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannelId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannelId.kt
new file mode 100644
index 0000000000..c4231deb8c
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationChannelId.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline value class NotificationChannelId(val value: String)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationId.kt
new file mode 100644
index 0000000000..9c20bf9420
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationId.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline value class NotificationId(val value: Int)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt
new file mode 100644
index 0000000000..fffe86c247
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationTunnelState.kt
@@ -0,0 +1,25 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface NotificationTunnelState {
+ data class Disconnected(val hasVpnPermission: Boolean) : NotificationTunnelState
+
+ data object Connecting : NotificationTunnelState
+
+ data object Connected : NotificationTunnelState
+
+ data object Reconnecting : NotificationTunnelState
+
+ data object Disconnecting : NotificationTunnelState
+
+ sealed interface Error : NotificationTunnelState {
+ data object DeviceOffline : Error
+
+ data object Blocking : Error
+
+ data object VpnPermissionDenied : Error
+
+ data object AlwaysOnVpn : Error
+
+ data object Critical : Error
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationUpdate.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationUpdate.kt
new file mode 100644
index 0000000000..00d64cbc3e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/NotificationUpdate.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface NotificationUpdate<out D> {
+ val notificationId: NotificationId
+
+ data class Notify<D>(override val notificationId: NotificationId, val value: D) :
+ NotificationUpdate<D>
+
+ data class Cancel(override val notificationId: NotificationId) : NotificationUpdate<Nothing>
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationEndpoint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationEndpoint.kt
new file mode 100644
index 0000000000..020ef8e5c1
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationEndpoint.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class ObfuscationEndpoint(val endpoint: Endpoint, val obfuscationType: ObfuscationType)
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/lib/model/ObfuscationSettings.kt
index 19b5c0e5f2..b8a26973a2 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ObfuscationSettings.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationSettings.kt
@@ -1,10 +1,11 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
+import arrow.optics.optics
-@Parcelize
+@optics
data class ObfuscationSettings(
val selectedObfuscation: SelectedObfuscation,
val udp2tcp: Udp2TcpObfuscationSettings
-) : Parcelable
+) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt
new file mode 100644
index 0000000000..cd71d645af
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class ObfuscationType {
+ Udp2Tcp
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Ownership.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Ownership.kt
new file mode 100644
index 0000000000..5257f944d3
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Ownership.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class Ownership {
+ MullvadOwned,
+ Rented
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ParameterGenerationError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ParameterGenerationError.kt
new file mode 100644
index 0000000000..476aed1407
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ParameterGenerationError.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class ParameterGenerationError {
+ NoMatchingRelay,
+ NoMatchingBridgeRelay,
+ NoWireguardKey,
+ CustomTunnelHostResultionError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchase.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchase.kt
new file mode 100644
index 0000000000..9384f9f5b8
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchase.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class PlayPurchase(val productId: String, val purchaseToken: PlayPurchasePaymentToken)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseInitError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseInitError.kt
new file mode 100644
index 0000000000..6326bab8e8
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseInitError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class PlayPurchaseInitError {
+ OtherError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchasePaymentToken.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchasePaymentToken.kt
new file mode 100644
index 0000000000..bfcae64d45
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchasePaymentToken.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline value class PlayPurchasePaymentToken(val value: String)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseVerifyError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseVerifyError.kt
new file mode 100644
index 0000000000..dc06b8ffbf
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PlayPurchaseVerifyError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class PlayPurchaseVerifyError {
+ OtherError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt
new file mode 100644
index 0000000000..bcb5a8dd99
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@JvmInline @Parcelize value class Port(val value: Int) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PortRange.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PortRange.kt
new file mode 100644
index 0000000000..77767a1011
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/PortRange.kt
@@ -0,0 +1,30 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcel
+import android.os.Parcelable
+import kotlinx.parcelize.Parceler
+import kotlinx.parcelize.Parcelize
+import kotlinx.parcelize.TypeParceler
+
+@JvmInline
+@Parcelize
+@TypeParceler<IntRange, IntRangeParceler>
+value class PortRange(val value: IntRange) : Parcelable {
+ operator fun contains(port: Port): Boolean = port.value in value
+
+ fun toFormattedString(): String =
+ if (value.first == value.last) {
+ value.first.toString()
+ } else {
+ "${value.first}-${value.last}"
+ }
+}
+
+object IntRangeParceler : Parceler<IntRange> {
+ override fun create(parcel: Parcel) = IntRange(parcel.readInt(), parcel.readInt())
+
+ override fun IntRange.write(parcel: Parcel, flags: Int) {
+ parcel.writeInt(start)
+ parcel.writeInt(endInclusive)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Provider.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Provider.kt
new file mode 100644
index 0000000000..e704e9554d
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Provider.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class Provider(val providerId: ProviderId, val ownership: Ownership)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ProviderId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ProviderId.kt
new file mode 100644
index 0000000000..cc23c3e9b6
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ProviderId.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline value class ProviderId(val value: String)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Providers.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Providers.kt
new file mode 100644
index 0000000000..73cf9facdb
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Providers.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class Providers(val providers: Set<ProviderId>) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/QuantumResistantState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/QuantumResistantState.kt
new file mode 100644
index 0000000000..c77dab72d3
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/QuantumResistantState.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class QuantumResistantState {
+ Auto,
+ On,
+ Off
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt
new file mode 100644
index 0000000000..d14a2f236b
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed class RedeemVoucherError {
+ data object InvalidVoucher : RedeemVoucherError()
+
+ data object VoucherAlreadyUsed : RedeemVoucherError()
+
+ data object RpcError : RedeemVoucherError()
+
+ data class Unknown(val error: Throwable) : RedeemVoucherError()
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherSuccess.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherSuccess.kt
new file mode 100644
index 0000000000..9c81042b8c
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherSuccess.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import org.joda.time.DateTime
+
+data class RedeemVoucherSuccess(val timeAdded: Long, val newExpiryDate: DateTime)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayConstraints.kt
new file mode 100644
index 0000000000..f3573933e3
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayConstraints.kt
@@ -0,0 +1,13 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class RelayConstraints(
+ val location: Constraint<RelayItemId>,
+ val providers: Constraint<Providers>,
+ val ownership: Constraint<Ownership>,
+ val wireguardConstraints: WireguardConstraints,
+) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
new file mode 100644
index 0000000000..a31a6f67df
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
@@ -0,0 +1,88 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+sealed interface RelayItem {
+ val id: RelayItemId
+ val name: String
+ val active: Boolean
+ val hasChildren: Boolean
+ val expanded: Boolean
+
+ @optics
+ data class CustomList(
+ override val id: CustomListId,
+ val customListName: CustomListName,
+ val locations: List<Location>,
+ override val expanded: Boolean,
+ ) : RelayItem {
+ override val name: String = customListName.value
+
+ override val active
+ get() = locations.any { location -> location.active }
+
+ override val hasChildren
+ get() = locations.isNotEmpty()
+
+ companion object
+ }
+
+ @optics
+ sealed interface Location : RelayItem {
+ override val id: GeoLocationId
+
+ @optics
+ data class Country(
+ override val id: GeoLocationId.Country,
+ override val name: String,
+ override val expanded: Boolean,
+ val cities: List<City>
+ ) : Location {
+ val relays = cities.flatMap { city -> city.relays }
+
+ override val active
+ get() = cities.any { city -> city.active }
+
+ override val hasChildren
+ get() = cities.isNotEmpty()
+
+ companion object
+ }
+
+ @optics
+ data class City(
+ override val id: GeoLocationId.City,
+ override val name: String,
+ override val expanded: Boolean,
+ val relays: List<Relay>
+ ) : Location {
+
+ override val active
+ get() = relays.any { relay -> relay.active }
+
+ override val hasChildren
+ get() = relays.isNotEmpty()
+
+ companion object
+ }
+
+ @optics
+ data class Relay(
+ override val id: GeoLocationId.Hostname,
+ val provider: Provider,
+ override val active: Boolean,
+ ) : Location {
+ override val name: String = id.hostname
+
+ override val hasChildren = false
+ override val expanded = false
+
+ companion object
+ }
+
+ companion object
+ }
+
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemId.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemId.kt
new file mode 100644
index 0000000000..da59481269
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemId.kt
@@ -0,0 +1,48 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import arrow.optics.optics
+import kotlinx.parcelize.Parcelize
+
+@optics
+sealed interface RelayItemId : Parcelable {
+ companion object
+}
+
+@optics
+@Parcelize
+@JvmInline
+value class CustomListId(val value: String) : RelayItemId, Parcelable {
+ companion object
+}
+
+@optics
+sealed interface GeoLocationId : RelayItemId {
+ @optics
+ @Parcelize
+ data class Country(val countryCode: String) : GeoLocationId {
+ companion object
+ }
+
+ @optics
+ @Parcelize
+ data class City(val countryCode: Country, val cityCode: String) : GeoLocationId {
+ companion object
+ }
+
+ @optics
+ @Parcelize
+ data class Hostname(val city: City, val hostname: String) : GeoLocationId {
+ companion object
+ }
+
+ val country: Country
+ get() =
+ when (this) {
+ is Country -> this
+ is City -> this.countryCode
+ is Hostname -> this.city.countryCode
+ }
+
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayList.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayList.kt
new file mode 100644
index 0000000000..39e43a713e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayList.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class RelayList(
+ val countries: List<RelayItem.Location.Country>,
+ val wireguardEndpointData: WireguardEndpointData
+)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayOverride.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayOverride.kt
index f738218ee7..3bd0a2f0a1 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayOverride.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayOverride.kt
@@ -1,12 +1,13 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
+import arrow.optics.optics
import java.net.InetAddress
-import kotlinx.parcelize.Parcelize
-@Parcelize
+@optics
data class RelayOverride(
val hostname: String,
val ipv4AddressIn: InetAddress?,
val ipv6AddressIn: InetAddress?
-) : Parcelable
+) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelaySettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelaySettings.kt
new file mode 100644
index 0000000000..ea40c980d0
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelaySettings.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class RelaySettings(val relayConstraints: RelayConstraints) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveDeviceError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveDeviceError.kt
new file mode 100644
index 0000000000..d00272ec63
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveDeviceError.kt
@@ -0,0 +1,9 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface RemoveDeviceError {
+ data object NotFound : RemoveDeviceError
+
+ data object RpcError : RemoveDeviceError
+
+ data class Unknown(val throwable: Throwable) : RemoveDeviceError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveSplitTunnelingAppError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveSplitTunnelingAppError.kt
new file mode 100644
index 0000000000..aa4dcfd8be
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RemoveSplitTunnelingAppError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+interface RemoveSplitTunnelingAppError {
+ data class Unknown(val throwable: Throwable) : RemoveSplitTunnelingAppError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SelectedObfuscation.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SelectedObfuscation.kt
new file mode 100644
index 0000000000..1651d61db7
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SelectedObfuscation.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.lib.model
+
+enum class SelectedObfuscation {
+ Auto,
+ Off,
+ Udp2Tcp
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAllowLanError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAllowLanError.kt
new file mode 100644
index 0000000000..e30eba0d9e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAllowLanError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetAllowLanError {
+ data class Unknown(val throwable: Throwable) : SetAllowLanError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAutoConnectError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAutoConnectError.kt
new file mode 100644
index 0000000000..b2b3b74edf
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetAutoConnectError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetAutoConnectError {
+ data class Unknown(val throwable: Throwable) : SetAutoConnectError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDnsOptionsError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDnsOptionsError.kt
new file mode 100644
index 0000000000..8d72d8cebe
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDnsOptionsError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetDnsOptionsError {
+ data class Unknown(val throwable: Throwable) : SetDnsOptionsError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetObfuscationOptionsError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetObfuscationOptionsError.kt
new file mode 100644
index 0000000000..d9c5acf650
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetObfuscationOptionsError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetObfuscationOptionsError {
+ data class Unknown(val throwable: Throwable) : SetObfuscationOptionsError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetRelayLocationError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetRelayLocationError.kt
new file mode 100644
index 0000000000..4606c46125
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetRelayLocationError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetRelayLocationError {
+ data class Unknown(val throwable: Throwable) : SetRelayLocationError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardConstraintsError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardConstraintsError.kt
new file mode 100644
index 0000000000..ccf8b4c8dc
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardConstraintsError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetWireguardConstraintsError {
+ data class Unknown(val throwable: Throwable) : SetWireguardConstraintsError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardMtuError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardMtuError.kt
new file mode 100644
index 0000000000..ca4f135fb1
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardMtuError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetWireguardMtuError {
+ data class Unknown(val throwable: Throwable) : SetWireguardMtuError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardQuantumResistantError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardQuantumResistantError.kt
new file mode 100644
index 0000000000..8121120c67
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetWireguardQuantumResistantError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetWireguardQuantumResistantError {
+ data class Unknown(val throwable: Throwable) : SetWireguardQuantumResistantError
+}
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/lib/model/Settings.kt
index 847b80cd70..c5191531be 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Settings.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt
@@ -1,16 +1,18 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
+import arrow.optics.optics
-@Parcelize
+@optics
data class Settings(
val relaySettings: RelaySettings,
val obfuscationSettings: ObfuscationSettings,
- val customLists: CustomListsSettings,
+ val customLists: List<CustomList>,
val allowLan: Boolean,
val autoConnect: Boolean,
val tunnelOptions: TunnelOptions,
- val relayOverrides: ArrayList<RelayOverride>,
+ val relayOverrides: List<RelayOverride>,
val showBetaReleases: Boolean,
-) : Parcelable
+ val splitTunnelSettings: SplitTunnelSettings
+) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SettingsPatchError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SettingsPatchError.kt
index 5e3cb29911..1db1dc6f68 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SettingsPatchError.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SettingsPatchError.kt
@@ -1,10 +1,6 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-sealed class SettingsPatchError : Parcelable {
+sealed class SettingsPatchError {
// E.g hostname is number instead of String
data class InvalidOrMissingValue(val value: String) : SettingsPatchError()
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SplitTunnelSettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SplitTunnelSettings.kt
new file mode 100644
index 0000000000..a937d53bae
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SplitTunnelSettings.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class SplitTunnelSettings(val enabled: Boolean, val excludedApps: Set<AppId>)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TransportProtocol.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TransportProtocol.kt
new file mode 100644
index 0000000000..b25e3061be
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TransportProtocol.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+enum class TransportProtocol : Parcelable {
+ Tcp,
+ Udp
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt
new file mode 100644
index 0000000000..d715f16766
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class TunnelEndpoint(
+ val endpoint: Endpoint,
+ val quantumResistant: Boolean,
+ val obfuscation: ObfuscationEndpoint?
+)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelOptions.kt
new file mode 100644
index 0000000000..de1d760d30
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelOptions.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class TunnelOptions(val wireguard: WireguardTunnelOptions, val dnsOptions: DnsOptions) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt
new file mode 100644
index 0000000000..3fae41802a
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt
@@ -0,0 +1,35 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed class TunnelState {
+ data class Disconnected(val location: GeoIpLocation? = null) : TunnelState()
+
+ data class Connecting(val endpoint: TunnelEndpoint?, val location: GeoIpLocation?) :
+ TunnelState()
+
+ data class Connected(val endpoint: TunnelEndpoint, val location: GeoIpLocation?) :
+ TunnelState()
+
+ data class Disconnecting(val actionAfterDisconnect: ActionAfterDisconnect) : TunnelState()
+
+ data class Error(val errorState: ErrorState) : TunnelState()
+
+ fun location(): GeoIpLocation? {
+ return when (this) {
+ is Connected -> location
+ is Connecting -> location
+ is Disconnecting -> null
+ is Disconnected -> location
+ is Error -> null
+ }
+ }
+
+ fun isSecured(): Boolean {
+ return when (this) {
+ is Connected,
+ is Connecting,
+ is Disconnecting, -> true
+ is Disconnected -> false
+ is Error -> this.errorState.isBlocking
+ }
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Udp2TcpObfuscationSettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Udp2TcpObfuscationSettings.kt
new file mode 100644
index 0000000000..7447f7a4cf
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Udp2TcpObfuscationSettings.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class Udp2TcpObfuscationSettings(val port: Constraint<Port>)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/UpdateCustomListError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/UpdateCustomListError.kt
new file mode 100644
index 0000000000..ef49018dca
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/UpdateCustomListError.kt
@@ -0,0 +1,35 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface UpdateCustomListNameError {
+ companion object {
+ fun from(error: UpdateCustomListError): UpdateCustomListNameError =
+ when (error) {
+ is NameAlreadyExists -> error
+ is UnknownCustomListError -> error
+ }
+ }
+}
+
+sealed interface UpdateCustomListLocationsError {
+ companion object {
+ fun from(error: UpdateCustomListError): UpdateCustomListLocationsError =
+ when (error) {
+ is NameAlreadyExists -> error("Not supported error")
+ is UnknownCustomListError -> error
+ }
+ }
+}
+
+sealed interface UpdateCustomListError
+
+data class NameAlreadyExists(val name: String) : UpdateCustomListError, UpdateCustomListNameError
+
+data class UnknownCustomListError(val throwable: Throwable) :
+ UpdateCustomListError,
+ UpdateCustomListNameError,
+ UpdateCustomListLocationsError,
+ CreateCustomListError,
+ DeleteCustomListError
+
+data class GetCustomListError(val id: CustomListId) :
+ UpdateCustomListLocationsError, UpdateCustomListNameError
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WebsiteAuthToken.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WebsiteAuthToken.kt
new file mode 100644
index 0000000000..8ad9b85787
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WebsiteAuthToken.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+@JvmInline
+value class WebsiteAuthToken private constructor(val value: String) {
+ companion object {
+ fun fromString(value: String) = WebsiteAuthToken(value)
+ }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt
new file mode 100644
index 0000000000..8affb81077
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import arrow.optics.optics
+
+@optics
+data class WireguardConstraints(val port: Constraint<Port>) {
+ companion object
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardEndpointData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardEndpointData.kt
new file mode 100644
index 0000000000..8aff7d2895
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardEndpointData.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class WireguardEndpointData(val portRanges: List<PortRange>)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt
new file mode 100644
index 0000000000..573f08213e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class WireguardTunnelOptions(val mtu: Mtu?, val quantumResistant: QuantumResistantState)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/extensions/String.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/extensions/String.kt
new file mode 100644
index 0000000000..0df57eb057
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/extensions/String.kt
@@ -0,0 +1,6 @@
+package net.mullvad.mullvadvpn.lib.model.extensions
+
+fun String.startCase() =
+ split(" ").joinToString(" ") { word ->
+ word.replaceFirstChar { firstChar -> firstChar.uppercase() }
+ }
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
deleted file mode 100644
index f5137ebbb7..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountAndDevice.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 4bb4c61384..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountCreationResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
index 6dda6b8352..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountData.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index f856ef8c89..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountExpiry.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-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 data 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
deleted file mode 100644
index f003ee316b..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountHistory.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.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/AccountToken.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountToken.kt
deleted file mode 100644
index 2aeca352d0..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AccountToken.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-@JvmInline value class AccountToken(val value: String)
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
deleted file mode 100644
index bbe99ce656..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/AppVersionInfo.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index d9ca22b164..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Constraint.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-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/CreateCustomListResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CreateCustomListResult.kt
deleted file mode 100644
index 73eaa209c8..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CreateCustomListResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-sealed class CreateCustomListResult : Parcelable {
- @Parcelize data class Ok(val id: String) : CreateCustomListResult()
-
- @Parcelize data class Error(val error: CustomListsError) : CreateCustomListResult()
-}
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
deleted file mode 100644
index bbf029dd4d..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomDnsOptions.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-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/CustomList.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomList.kt
deleted file mode 100644
index cdfa1b9687..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomList.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class CustomList(
- val id: String,
- val name: String,
- val locations: ArrayList<GeographicLocationConstraint>
-) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsError.kt
deleted file mode 100644
index 83806af4f7..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsError.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-enum class CustomListsError {
- CustomListExists,
- OtherError
-}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsSettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsSettings.kt
deleted file mode 100644
index 8a8c03ef05..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomListsSettings.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize data class CustomListsSettings(val customLists: ArrayList<CustomList>) : 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
deleted file mode 100644
index 72276c65e4..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/CustomTunnelEndpoint.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-class CustomTunnelEndpoint
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
deleted file mode 100644
index 0f0a55d05d..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class Device(
- val id: String,
- private val name: String,
- val pubkey: ByteArray,
- 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
- return pubkey.contentEquals(other.pubkey)
- }
-
- // Generated by Android Studio
- override fun hashCode(): Int {
- var result = id.hashCode()
- result = 31 * result + name.hashCode()
- result = 31 * result + pubkey.contentHashCode()
- return result
- }
-
- fun displayName(): String = name.capitalizeFirstCharOfEachWord()
-}
-
-private fun String.capitalizeFirstCharOfEachWord(): String {
- return split(" ")
- .joinToString(" ") { word -> word.replaceFirstChar { firstChar -> firstChar.uppercase() } }
- .trimEnd()
-}
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
deleted file mode 100644
index 741108612d..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEvent.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index b4c1d21761..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceEventCause.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index afe5982ed5..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceList.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 7a2883617b..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceListEvent.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-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
deleted file mode 100644
index e43eae3e6b..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DevicePort.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index fb34c9e645..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/DeviceState.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-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?.displayName()
- }
-
- fun token(): String? {
- return (this as? LoggedIn)?.accountAndDevice?.account_token
- }
-}
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
deleted file mode 100644
index 386257a72a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GeographicLocationConstraint.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-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, 0.0, 0.0, null)
- }
-
- @Parcelize
- data class City(val countryCode: String, val cityCode: String) :
- GeographicLocationConstraint() {
- override val location: GeoIpLocation
- get() = GeoIpLocation(null, null, countryCode, cityCode, 0.0, 0.0, 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, 0.0, 0.0, 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
deleted file mode 100644
index 2e94266e2a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/GetAccountDataResult.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 0c9d331e3b..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LocationConstraint.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 29fb68203d..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginResult.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-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/Ownership.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Ownership.kt
deleted file mode 100644
index 43037be676..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Ownership.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-enum class Ownership : Parcelable {
- MullvadOwned,
- Rented
-}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchase.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchase.kt
deleted file mode 100644
index 8ae46a07a9..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchase.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize data class PlayPurchase(val productId: String, val purchaseToken: String) : Parcelable
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitError.kt
deleted file mode 100644
index 39aebabbe2..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitError.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-enum class PlayPurchaseInitError : Parcelable {
- // TODO: Add more errors here.
- OtherError
-}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitResult.kt
deleted file mode 100644
index 41407474af..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseInitResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-sealed class PlayPurchaseInitResult : Parcelable {
- @Parcelize data class Ok(val obfuscatedId: String) : PlayPurchaseInitResult()
-
- @Parcelize data class Error(val error: PlayPurchaseInitError) : PlayPurchaseInitResult()
-}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyError.kt
deleted file mode 100644
index b0434c22f9..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyError.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-enum class PlayPurchaseVerifyError : Parcelable {
- // TODO: Add more errors here.
- OtherError
-}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyResult.kt
deleted file mode 100644
index 7c5ee4d953..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PlayPurchaseVerifyResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-sealed class PlayPurchaseVerifyResult : Parcelable {
- @Parcelize data object Ok : PlayPurchaseVerifyResult()
-
- @Parcelize data class Error(val error: PlayPurchaseVerifyError) : PlayPurchaseVerifyResult()
-}
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
deleted file mode 100644
index 52f495a7a7..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Port.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 376f5ef7a4..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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/Providers.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Providers.kt
deleted file mode 100644
index d3c6aacba9..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Providers.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Suppress("ensure value classes property is named value")
-@JvmInline
-@Parcelize
-value class Providers(val providers: HashSet<String>) : 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
deleted file mode 100644
index 169b6c3856..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index a19267388a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 461648209c..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Relay.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class Relay(
- val hostname: String,
- val active: Boolean,
- val owned: Boolean,
- val provider: String,
- 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
deleted file mode 100644
index 031b09bace..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayConstraints.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class RelayConstraints(
- val location: Constraint<LocationConstraint>,
- val providers: Constraint<Providers>,
- val ownership: Constraint<Ownership>,
- val wireguardConstraints: WireguardConstraints,
-) : Parcelable
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
deleted file mode 100644
index 86b3f0fa35..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayEndpointData.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 60d8b6dd35..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
index 2376609ced..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCity.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index d6d4b8ec6a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayListCountry.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 642046f1b8..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-sealed class RelaySettings : Parcelable {
- @Parcelize data object CustomTunnelEndpoint : RelaySettings()
-
- @Parcelize data class Normal(val relayConstraints: RelayConstraints) : RelaySettings()
-
- fun relayConstraints(): RelayConstraints? = (this as? Normal)?.relayConstraints
-}
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
deleted file mode 100644
index cc6e7db2bb..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceEvent.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 67bf165a37..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RemoveDeviceResult.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index 8124bcc6a6..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/SelectedObfuscation.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index e597797e5a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/ServiceResult.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-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/TunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
deleted file mode 100644
index 108fd32e04..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 4ab925d014..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-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
-
-sealed class TunnelState : Parcelable {
- @Parcelize
- data class Disconnected(val location: GeoIpLocation? = null) : 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 location(): GeoIpLocation? {
- return when (this) {
- is Connected -> location
- is Connecting -> location
- is Disconnecting -> null
- is Disconnected -> location
- is Error -> null
- }
- }
-
- fun isSecured(): Boolean {
- return when (this) {
- is Connected,
- is Connecting,
- is Disconnecting, -> true
- is Disconnected -> false
- is Error -> this.errorState.isBlocking
- }
- }
-}
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
deleted file mode 100644
index f01bb35c6f..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/Udp2TcpObfuscationSettings.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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/UpdateCustomListResult.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/UpdateCustomListResult.kt
deleted file mode 100644
index ebfe9e8cd6..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/UpdateCustomListResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-sealed class UpdateCustomListResult : Parcelable {
- @Parcelize data object Ok : UpdateCustomListResult()
-
- @Parcelize data class Error(val error: CustomListsError) : UpdateCustomListResult()
-}
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
deleted file mode 100644
index efe05e2f5c..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmission.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 1cf778400a..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index 4163b782d4..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
index 1725b01f0f..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardConstraints.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 0a21221bb0..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 4a1930dd43..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardRelayEndpointData.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index f4a869a4ea..0000000000
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.mullvad.mullvadvpn.model
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: QuantumResistantState) :
- Parcelable
diff --git a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatLongTest.kt b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatLongTest.kt
index b8608ca55c..8abef5d9b3 100644
--- a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatLongTest.kt
+++ b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatLongTest.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.sqrt
import org.junit.jupiter.api.Assertions.assertEquals
diff --git a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatitudeTest.kt b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatitudeTest.kt
index c883f20bfc..214afef127 100644
--- a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LatitudeTest.kt
+++ b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LatitudeTest.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.absoluteValue
import kotlin.test.assertEquals
diff --git a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LongitudeTest.kt b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LongitudeTest.kt
index 69d3445417..88017cdcea 100644
--- a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/model/LongitudeTest.kt
+++ b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/LongitudeTest.kt
@@ -1,4 +1,4 @@
-package net.mullvad.mullvadvpn.model
+package net.mullvad.mullvadvpn.lib.model
import kotlin.math.absoluteValue
import kotlin.test.assertEquals