diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-10-01 15:31:58 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-10-14 09:38:51 +0200 |
| commit | 813bb62f92680a149c9c1482964ec31fae0b47c3 (patch) | |
| tree | dcba71b58d03985b25dfbb0a5f575e20d46b9e87 /android/lib | |
| parent | 72864c0654510a5a9b2fc5493233880b9fba93d7 (diff) | |
| download | mullvadvpn-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')
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 & 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> |
