summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-10-01 15:31:58 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-10-14 09:38:51 +0200
commit813bb62f92680a149c9c1482964ec31fae0b47c3 (patch)
treedcba71b58d03985b25dfbb0a5f575e20d46b9e87 /android/lib
parent72864c0654510a5a9b2fc5493233880b9fba93d7 (diff)
downloadmullvadvpn-813bb62f92680a149c9c1482964ec31fae0b47c3.tar.xz
mullvadvpn-813bb62f92680a149c9c1482964ec31fae0b47c3.zip
Improve login and create account error messages
- Add support for more types of login error messages - Add more detail to create account error message - Show info dialog when api is unreachable
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/build.gradle.kts1
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt21
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/CreateAccountError.kt6
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/LoginAccountError.kt8
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml16
-rw-r--r--android/lib/resource/src/main/res/values/strings_non_translatable.xml3
6 files changed, 51 insertions, 4 deletions
diff --git a/android/lib/daemon-grpc/build.gradle.kts b/android/lib/daemon-grpc/build.gradle.kts
index cadd126830..3dde9bf8a8 100644
--- a/android/lib/daemon-grpc/build.gradle.kts
+++ b/android/lib/daemon-grpc/build.gradle.kts
@@ -25,6 +25,7 @@ android {
compilerOptions {
jvmTarget = JvmTarget.fromTarget(libs.versions.jvm.target.get())
allWarningsAsErrors = true
+ freeCompilerArgs = listOf("-XXLanguage:+WhenGuards")
}
}
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
index 0a9266eb50..62d78bc4e7 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
@@ -346,9 +346,13 @@ class ManagementService(
.mapLeftStatus {
when (it.status.code) {
Status.Code.UNAUTHENTICATED -> LoginAccountError.InvalidAccount
+ Status.Code.RESOURCE_EXHAUSTED if it.status.isTooManyRequests() ->
+ LoginAccountError.TooManyAttempts
Status.Code.RESOURCE_EXHAUSTED ->
LoginAccountError.MaxDevicesReached(accountNumber)
- Status.Code.UNAVAILABLE -> LoginAccountError.RpcError
+ Status.Code.DEADLINE_EXCEEDED -> LoginAccountError.Timeout
+ Status.Code.INVALID_ARGUMENT -> LoginAccountError.InvalidInput(accountNumber)
+ Status.Code.UNAVAILABLE -> LoginAccountError.ApiUnreachable
else -> {
Logger.e("Unknown login account error")
LoginAccountError.Unknown(it)
@@ -403,7 +407,16 @@ class ManagementService(
AccountNumber(accountNumberStringValue.value)
}
.onLeft { Logger.e("Create account error") }
- .mapLeft(CreateAccountError::Unknown)
+ .mapLeftStatus {
+ when (it.status.code) {
+ Status.Code.RESOURCE_EXHAUSTED -> CreateAccountError.TooManyAttempts
+ Status.Code.UNAVAILABLE -> CreateAccountError.ApiUnreachable
+ Status.Code.DEADLINE_EXCEEDED -> CreateAccountError.TimeOut
+ else -> {
+ CreateAccountError.Unknown(it)
+ }
+ }
+ }
suspend fun updateDnsContentBlockers(
update: (DefaultDnsOptions) -> DefaultDnsOptions
@@ -900,8 +913,12 @@ class ManagementService(
}
}
+ private fun Status.isTooManyRequests() = description == TOO_MANY_REQUESTS
+
companion object {
const val ENABLE_TRACE_LOGGING = false
+
+ const val TOO_MANY_REQUESTS = "429 Too Many Requests"
}
}
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
index eeeaf11fca..f32e2abf22 100644
--- 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
@@ -1,5 +1,11 @@
package net.mullvad.mullvadvpn.lib.model
sealed class CreateAccountError {
+ data object TooManyAttempts : CreateAccountError()
+
+ data object ApiUnreachable : CreateAccountError()
+
+ data object TimeOut : CreateAccountError()
+
data class Unknown(val error: Throwable) : CreateAccountError()
}
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
index 99c36bc9d2..462a6f3cc6 100644
--- 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
@@ -9,7 +9,13 @@ sealed class LoginAccountError : Parcelable {
data class MaxDevicesReached(val accountNumber: AccountNumber) : LoginAccountError()
- data object RpcError : LoginAccountError()
+ data class InvalidInput(val accountNumber: AccountNumber) : LoginAccountError()
+
+ data object TooManyAttempts : LoginAccountError()
+
+ data object Timeout : LoginAccountError()
+
+ data object ApiUnreachable : LoginAccountError()
data class Unknown(val error: Throwable) : LoginAccountError()
}
diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml
index bc07a73fd7..9966130a23 100644
--- a/android/lib/resource/src/main/res/values/strings.xml
+++ b/android/lib/resource/src/main/res/values/strings.xml
@@ -445,4 +445,20 @@
<string name="android_16_upgrade_warning_dialog_first_message">After updating a VPN app on Android 16, devices might end up in a state where VPN apps are no longer able to reach the internet.</string>
<string name="android_16_upgrade_warning_dialog_second_message">Please restart your device and try connecting again. If this does not work, please write an email to %s in Swedish or English.</string>
<string name="click_here">click here</string>
+ <string name="login_error_api_unreachable">Unable to reach API, %s</string>
+ <string name="login_error_too_many_attempts">Too many attempts, please try again later</string>
+ <string name="login_error_invalid_input">Account number is too long, please enter a valid number</string>
+ <string name="create_account_fail_title">Creating account failed</string>
+ <string name="read_more_here">read more here</string>
+ <string name="unable_to_reach_api_dialog_title">Unable to reach API</string>
+ <string name="unable_to_reach_api_dialog_message_first">The app was unable to %s due to not being able to reach the Mullvad API. This might be due to censorship or network issues. Please try to:</string>
+ <string name="unable_to_reach_api_dialog_action_login">login</string>
+ <string name="unable_to_reach_api_dialog_action_create">create an account</string>
+ <string name="unable_to_reach_api_dialog_message_list_first">Restart your device</string>
+ <string name="unable_to_reach_api_dialog_message_list_second">Connect to a different network</string>
+ <string name="unable_to_reach_api_dialog_message_list_third">Enable all access methods in the app</string>
+ <string name="unable_to_reach_api_dialog_message_second">If these steps don’t work, please send an email to support using the button below. It will automatically attach the logs which have been anonymized.</string>
+ <string name="enable_all_methods">Enable all &amp; retry</string>
+ <string name="send_email">Send email</string>
+ <string name="no_email_app_available">No email app available on the device</string>
</resources>
diff --git a/android/lib/resource/src/main/res/values/strings_non_translatable.xml b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
index 0c87a19c25..529c8c625c 100644
--- a/android/lib/resource/src/main/res/values/strings_non_translatable.xml
+++ b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
@@ -18,5 +18,6 @@
</string>
<string name="daita" translatable="false">DAITA</string>
<string name="daita_full" translatable="false">Defence against AI-guided Traffic Analysis</string>
- <string name="support_email">support@mullvadvpn.net</string>
+ <string name="support_email" translatable="false">support@mullvadvpn.net</string>
+ <string name="support_email_subject" translatable="false">Mullvad VPN App %s Android %s (%d) - %s %s</string>
</resources>