diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-14 16:23:38 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-14 16:23:38 -0300 |
| commit | 78648a9f16ebaca1eaeb2525b25d2e42614e3e10 (patch) | |
| tree | 6c87ba4ab52d56da4d5bab6b3eaf256ca963a509 | |
| parent | 65b957623a04bff6a9c5b246635225ff0317c819 (diff) | |
| parent | 14578dc00003f87e680d0d367a5ee86f48116024 (diff) | |
| download | mullvadvpn-78648a9f16ebaca1eaeb2525b25d2e42614e3e10.tar.xz mullvadvpn-78648a9f16ebaca1eaeb2525b25d2e42614e3e10.zip | |
Merge branch 'account-cache-retries'
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt | 42 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt | 4 |
3 files changed, 34 insertions, 13 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8725e50f26..f43e4b1c8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ Line wrap the file at 100 chars. Th - Fix UI losing any settings updates that happen after leaving the app and then coming back. - Fix account expiration date disappearing in some circumstances. - Fix notification reappearing after quitting the application. +- Retry when fetching account expiration fails. ## [2020.4] - 2020-05-12 diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt index 07fa7911fc..8cae8baee1 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt @@ -1,5 +1,7 @@ package net.mullvad.mullvadvpn.service +import kotlin.math.min +import kotlinx.coroutines.delay import net.mullvad.mullvadvpn.model.GetAccountDataResult import net.mullvad.mullvadvpn.util.JobTracker import org.joda.time.DateTime @@ -27,24 +29,22 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList } fun fetchAccountExpiry() { - accountNumber?.let { accountNumberUsedForFetch -> + accountNumber?.let { account -> jobTracker.newBackgroundJob("fetch") { - val accountData = accountNumberUsedForFetch?.let { account -> + var retryAttempt = 0 + + while (onAccountDataChange != null) { val result = daemon.getAccountData(account) - when (result) { - is GetAccountDataResult.Ok -> result.accountData - else -> null + if (result is GetAccountDataResult.Ok) { + handleNewExpiry(account, result.accountData.expiry) + break + } else if (result is GetAccountDataResult.InvalidAccount) { + break } - } - synchronized(this@AccountCache) { - if (this@AccountCache.accountNumber === accountNumberUsedForFetch) { - accountData?.expiry?.let { expiry -> - accountExpiry = DateTime.parse(expiry, EXPIRY_FORMAT) - notifyChange() - } - } + retryAttempt += 1 + delay(calculateRetryFetchDelay(retryAttempt)) } } } @@ -65,7 +65,23 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList } } + private fun handleNewExpiry(accountNumberUsedForFetch: String, expiryString: String) { + synchronized(this) { + if (accountNumber === accountNumberUsedForFetch) { + accountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT) + notifyChange() + } + } + } + private fun notifyChange() { onAccountDataChange?.invoke(accountNumber, accountExpiry) } + + private fun calculateRetryFetchDelay(retryAttempt: Int): Long { + // delay in seconds = 2 ^ retryAttempt capped at 2^13 (8192) + val exponent = min(retryAttempt, 13) + + return (1L shl exponent) * 1000L + } } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt index 6d993a8a55..01615b7d7a 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt @@ -43,6 +43,10 @@ class AccountFragment : ServiceDependentFragment(OnNoService.GoBack) { override fun onSafelyResume() { accountCache.onAccountDataChange = { accountNumber, accountExpiry -> updateViewJob = updateView(accountNumber, accountExpiry) + + if (accountExpiry == null) { + accountCache.fetchAccountExpiry() + } } } |
