summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-13 18:34:30 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-14 18:51:00 +0000
commit8acc061c0bcbb061e85bfe88813e12ab5be42c83 (patch)
treeda726b9c775b09d367c890733be466f1be33e76b
parent2625faf829df6fc768d0edcdfdca237af56dc081 (diff)
downloadmullvadvpn-8acc061c0bcbb061e85bfe88813e12ab5be42c83.tar.xz
mullvadvpn-8acc061c0bcbb061e85bfe88813e12ab5be42c83.zip
Retry fetching expiry if it fails
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt25
1 files changed, 22 insertions, 3 deletions
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 86e1b0c95a..24c62bc2c2 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
@@ -29,10 +31,20 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
fun fetchAccountExpiry() {
accountNumber?.let { account ->
jobTracker.newBackgroundJob("fetch") {
- val result = daemon.getAccountData(account)
+ var retryAttempt = 0
- if (result is GetAccountDataResult.Ok) {
- handleNewExpiry(account, result.accountData.expiry)
+ while (true) {
+ val result = daemon.getAccountData(account)
+
+ if (result is GetAccountDataResult.Ok) {
+ handleNewExpiry(account, result.accountData.expiry)
+ break
+ } else if (result is GetAccountDataResult.InvalidAccount) {
+ break
+ }
+
+ retryAttempt += 1
+ delay(calculateRetryFetchDelay(retryAttempt))
}
}
}
@@ -65,4 +77,11 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
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
+ }
}