diff options
4 files changed, 45 insertions, 27 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt new file mode 100644 index 0000000000..1cf778400a --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionError.kt @@ -0,0 +1,12 @@ +package net.mullvad.mullvadvpn.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +enum class VoucherSubmissionError : Parcelable { + InvalidVoucher, + VoucherAlreadyUsed, + RpcError, + OtherError, +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt index 7403d66014..b78957d5c0 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/VoucherSubmissionResult.kt @@ -5,17 +5,8 @@ import kotlinx.parcelize.Parcelize sealed class VoucherSubmissionResult : Parcelable { @Parcelize - class Ok(val submission: VoucherSubmission) : VoucherSubmissionResult(), Parcelable + data class Ok(val submission: VoucherSubmission) : VoucherSubmissionResult() @Parcelize - object InvalidVoucher : VoucherSubmissionResult(), Parcelable - - @Parcelize - object VoucherAlreadyUsed : VoucherSubmissionResult(), Parcelable - - @Parcelize - object RpcError : VoucherSubmissionResult(), Parcelable - - @Parcelize - object OtherError : VoucherSubmissionResult(), Parcelable + data class Error(val error: VoucherSubmissionError) : VoucherSubmissionResult() } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt index 41cb29498b..a25ac6a1d8 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RedeemVoucherDialogFragment.kt @@ -14,6 +14,7 @@ import android.widget.EditText import android.widget.TextView import androidx.fragment.app.DialogFragment import net.mullvad.mullvadvpn.R +import net.mullvad.mullvadvpn.model.VoucherSubmissionError import net.mullvad.mullvadvpn.model.VoucherSubmissionResult import net.mullvad.mullvadvpn.ui.serviceconnection.AccountCache import net.mullvad.mullvadvpn.ui.serviceconnection.VoucherRedeemer @@ -126,9 +127,7 @@ class RedeemVoucherDialogFragment : DialogFragment() { } private fun updateRedeemButton() { - redeemButton?.apply { - setEnabled(voucherInputIsValid && voucherRedeemer != null) - } + redeemButton?.setEnabled(voucherInputIsValid && voucherRedeemer != null) } private suspend fun submitVoucher() { @@ -138,11 +137,7 @@ class RedeemVoucherDialogFragment : DialogFragment() { when (result) { is VoucherSubmissionResult.Ok -> handleAddedTime(result.submission.timeAdded) - is VoucherSubmissionResult.InvalidVoucher -> showError(R.string.invalid_voucher) - is VoucherSubmissionResult.VoucherAlreadyUsed -> { - showError(R.string.voucher_already_used) - } - else -> showError(R.string.error_occurred) + is VoucherSubmissionResult.Error -> showError(result.error) } } @@ -156,7 +151,13 @@ class RedeemVoucherDialogFragment : DialogFragment() { } } - private fun showError(message: Int) { + private fun showError(error: VoucherSubmissionError) { + val message = when (error) { + VoucherSubmissionError.InvalidVoucher -> R.string.invalid_voucher + VoucherSubmissionError.VoucherAlreadyUsed -> R.string.voucher_already_used + else -> R.string.error_occurred + } + errorMessage.apply { setText(message) visibility = View.VISIBLE diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index 35fe78dd01..32d89a84cf 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -94,6 +94,12 @@ impl From<Result<AccountData, daemon_interface::Error>> for GetAccountDataResult #[jnix(package = "net.mullvad.mullvadvpn.model")] pub enum VoucherSubmissionResult { Ok(VoucherSubmission), + Error(VoucherSubmissionError), +} + +#[derive(IntoJava)] +#[jnix(package = "net.mullvad.mullvadvpn.model")] +pub enum VoucherSubmissionError { InvalidVoucher, VoucherAlreadyUsed, RpcError, @@ -104,15 +110,23 @@ impl From<Result<VoucherSubmission, daemon_interface::Error>> for VoucherSubmiss fn from(result: Result<VoucherSubmission, daemon_interface::Error>) -> Self { match result { Ok(submission) => VoucherSubmissionResult::Ok(submission), - Err(daemon_interface::Error::RpcError(RestError::ApiError(_, code))) => { + Err(error) => VoucherSubmissionResult::Error(error.into()), + } + } +} + +impl From<daemon_interface::Error> for VoucherSubmissionError { + fn from(error: daemon_interface::Error) -> Self { + match error { + daemon_interface::Error::RpcError(RestError::ApiError(_, code)) => { match code.as_str() { - mullvad_rpc::INVALID_VOUCHER => VoucherSubmissionResult::InvalidVoucher, - mullvad_rpc::VOUCHER_USED => VoucherSubmissionResult::VoucherAlreadyUsed, - _ => VoucherSubmissionResult::RpcError, + mullvad_rpc::INVALID_VOUCHER => VoucherSubmissionError::InvalidVoucher, + mullvad_rpc::VOUCHER_USED => VoucherSubmissionError::VoucherAlreadyUsed, + _ => VoucherSubmissionError::RpcError, } } - Err(daemon_interface::Error::RpcError(_)) => VoucherSubmissionResult::RpcError, - _ => VoucherSubmissionResult::OtherError, + daemon_interface::Error::RpcError(_) => VoucherSubmissionError::RpcError, + _ => VoucherSubmissionError::OtherError, } } } @@ -908,7 +922,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_service_MullvadDaemon_submitV VoucherSubmissionResult::from(raw_result) } else { - VoucherSubmissionResult::OtherError + VoucherSubmissionResult::Error(VoucherSubmissionError::OtherError) }; result.into_java(&env).forget() |
