summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-14 16:23:38 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-14 16:23:38 -0300
commit78648a9f16ebaca1eaeb2525b25d2e42614e3e10 (patch)
tree6c87ba4ab52d56da4d5bab6b3eaf256ca963a509
parent65b957623a04bff6a9c5b246635225ff0317c819 (diff)
parent14578dc00003f87e680d0d367a5ee86f48116024 (diff)
downloadmullvadvpn-78648a9f16ebaca1eaeb2525b25d2e42614e3e10.tar.xz
mullvadvpn-78648a9f16ebaca1eaeb2525b25d2e42614e3e10.zip
Merge branch 'account-cache-retries'
-rw-r--r--CHANGELOG.md1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt42
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt4
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()
+ }
}
}